Пытаясь запустить снаряд в направлении игрового объекта, не двигайтесь! =

1

Я делаю двумерную игру Tower Defense и хочу, чтобы мои башни запустили сборку у миньонов. Однако в настоящее время он только порождает мой желаемый сбор, но не перемещает его.

Мои два сценария:

public class Attacker : MonoBehaviour {

// Public variables
public GameObject ammoPrefab;
public float reloadTime;
public float projectileSpeed;

// Private variables
private Transform target;


// Use this for initialization
void Start () {
}

// Update is called once per frame
void Update () {

}
void OnTriggerEnter(Collider co){
    if (co.gameObject.tag == "Enemy" || co.gameObject.tag == "BlockTower") { 
        Debug.Log("Enemy tag detected");

        if(this.gameObject.tag == "Enemy" && co.gameObject.tag != "Enemy"){
            Debug.Log("This is an Enemy");
            // Insert for Enemey to attack Block Towers.
        }
        if(this.gameObject.tag == "Tower" && co.gameObject.tag != "BlockTower"){
            Debug.Log("This is a Tower");
            Tower Tower = GetComponent<Tower>();
            Tower.CalculateCombatTime(reloadTime, projectileSpeed);
            Transform SendThis = co.transform;
            Tower.SetTarget(SendThis);
        }
    }
}

}

а также

public class Tower : MonoBehaviour {
private Transform target;
private float fireSpeed;
private double nextFireTime;
private GameObject bullet;
private Attacker source;

// Use this for initialization
public virtual void Start () {
    source = this.GetComponent<Attacker> ();
}

// Update is called once per frame
public virtual void Update () {

    if (target) {
        Debug.Log("I have a target");
        //if(nextFireTime <= Time.deltaTime)
        FireProjectile ();
    }
}
public void CalculateCombatTime(float time, float speed){
    Debug.Log("Calculate Combat Speed");
    nextFireTime = Time.time + (time * .5);
    fireSpeed = speed;
}
public void SetTarget(Transform position){
    Debug.Log("Set Target");
    target = position;
}
public void FireProjectile(){
    Debug.Log("Shoot Projectile");
    bullet = (GameObject)Instantiate (source.ammoPrefab, transform.position, source.ammoPrefab.transform.rotation);
    float speed = fireSpeed * Time.deltaTime;
    bullet.transform.position = Vector3.MoveTowards (bullet.transform.position, target.position, speed);
}

}

В основном атакующий обнаруживает объект, который сталкивается с ним, тогда, если его тег "Башня", он отправит информацию в "Башню". Мой отладка показывает, что каждая функция работает, даже "Debug.Log("Shoot Projectile");" появляется.

Однако он не движется к моей цели, поэтому я думаю, что "bullet.transform.position = Vector3.MoveTowards(bullet.transform.position, target.position, step);" никогда не выполняется?

  • 0
    В будущем, возможно, будет лучше задать вопросы по разработке игр на Game Development.SE . Например, здесь люди предлагают составить список маркеров, а не использовать метод Update() который есть во всех экземплярах MonoBehaviour. Люди из GD будут знать о тонкостях Unity и смогут дать лучший, более конкретный совет.
Теги:
unity3d
unity3d-2dtools

2 ответа

0
Лучший ответ

Vector3.MoveTowards только перемещает объект один раз, это просто мгновенное смещение при FireProjectile.

Вам нужно создать какой-то сценарий Update() функцией Update() чтобы заставить его двигаться со временем.

Вот пример:

public class Projectile : MonoBehaviour
{
    public Vector3 TargetPosition;

    void Update()
    {
        transform.position = Vector3.MoveTowards(transform.position, TargetPosition, speed * Time.DeltaTime);
    }
}

Затем сразу после создания пули установите цель:

bullet.GetComponent<Projectile>().TargetPosition = target.position;

Надеюсь, поможет.

  • 0
    В качестве примечания: если вы хотите создавать снайкерские снаряды, которые следуют за своими целями, вы можете передать target.gameObject вместо позиции цели.
  • 0
    Спасибо человек, это была проблема :)
0

Вы должны обновить положение пули. Вы двигаетесь только при создании пули.

Попробуйте составить список пуль и использовать функцию обновления, чтобы изменить позицию.

  • 0
    Обратите внимание, что вы создаете экземпляр пули каждый раз, когда вызываете fireprojctile, и он не обновляет созданную пулю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню