Пуля не летит к цели

Не уверен, почему, я делал это много раз, но это вызывает у меня некоторые проблемы. Создавая проект для Game AI, я уже сделал целую кучу вещей, а теперь просто делаю несколько турелей, которые, если игрок находится в определенном диапазоне, будут стрелять, что у меня уже есть. Турель выпускает пулю, а потом по какой-то причине они просто начинают разрушаться и не идут на моего игрока. Хотите знать, может ли кто-нибудь здесь помочь, заранее спасибо!

Некоторые детали, которые вам могут понадобиться знать: у меня есть база, носовая часть и пушка для моей башни. У My Gun есть сценарий GunLook.cs, который заставляет его смотреть на игрока (поэтому, когда они стреляют, он должен идти в их сторону), я не уверен, имеет ли это какое-либо отношение к тому, почему у меня возникают эти проблемы, но я Я опубликую этот код на всякий случай

Как мой Hierchy для моей башни - Turret_AI (Base) Gun (child of Turret_AI) bulletSpawn (child of Gun) Gun_Nose (child of turret_AI)

bulletSpawn - это пустой GameObject, который я создал в надежде решить мою проблему. Я поставил его прямо из пистолета, чтобы он не столкнулся с пушкой и не уничтожил себя (что я думал, что он может делать, но не правильно).

Это должна быть вся необходимая информация, если кому-то понадобится больше, я буду проверять ее каждые 2 секунды, так что дайте мне знать, и я свяжусь с вами с быстрым ответом.

TurretScript.cs (я установил GameObject на Player в Unity, прежде чем кто-нибудь спросит)

using UnityEngine;
using System.Collections;

public class TurretScript : MonoBehaviour {
[SerializeField]
public GameObject Bullet;
public float distance = 3.0f;
public float secondsBetweenShots = 0.75f;
public GameObject followThis;
private Transform target;
private float timeStamp = 0.0f;

void Start () {
    target = followThis.transform;
}

void Fire() {
    Instantiate(Bullet, transform.position , transform.rotation);
    Debug.Log ("FIRE");
}

void Update () {

    if (Time.time >= timeStamp && (target.position - target.position).magnitude < distance) {
        Fire();
        timeStamp = Time.time + secondsBetweenShots;
    }
}
}

GunLook.cs

// C#
using System;
using UnityEngine;

public class GunLook : MonoBehaviour
{
public Transform target;

void Update()
{
    if(target != null)
    {
        transform.LookAt(target);
    }
}
}

BulletBehavior.cs

using UnityEngine;
using System.Collections;

public class BulletBehavior : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
    if (rigidbody.velocity.magnitude <= 0.5)
                    Destroy (gameObject);
}

void OnCollisionEnter(Collision collision)
{
    if (collision.collider)
    {
        if(collision.gameObject.tag == "Enemy" || collision.gameObject.tag == "EnemyProjectile")
        {
               Physics.IgnoreCollision(rigidbody.collider,collision.collider);
            //Debug.Log ("Enemy");
        }
        if(collision.gameObject.tag == "SolidObject")
        {
            Destroy(gameObject);
        }
        if(collision.gameObject.tag == "Player")
        {
            Destroy(gameObject);
        }
    }
}
}

person Community    schedule 26.02.2014    source источник
comment
Вы можете более четко объяснить, что происходит с пулями? Вы имеете в виду, что они начинают стрелять, а затем внезапно исчезают? Они вообще двигаются? Можете ли вы объяснить подробно - я не вижу ничего серьезного неправильного, но на самом деле я не использовал Unity - я подозреваю, что проблема в другом месте в кодовой базе, хотя   -  person Charleh    schedule 26.02.2014
comment
Можете ли вы также опубликовать скрипт для маркеров - похоже, вы создаете их экземпляры, но у вас нет ссылки на копию, поэтому я предполагаю, что у вас есть сценарий маркеров   -  person Charleh    schedule 26.02.2014
comment
Это очень странно, пуля действительно движется, я вижу, что она создается, и первая улетает примерно на 2 секунды, умирает, а затем 2 других замораживаются на порождении, и я получаю исключение NullReferenceException, но не говорит мне, почему. Я также опубликую сценарий Bullet @Charleh   -  person    schedule 26.02.2014


Ответы (1)


Вы никогда не двигаете пулю.

public class BulletBehavior : MonoBehaviour
{
  private const float DefaultSpeed = 1.0f;
  private float startTime;

  public Vector3 destination;
  public Vector3 origin;
  public float? speed;

  public void Start()
  {
    speed = speed ?? DefaultSpeed;
    startTime = Time.time;
  }

  public void Update()
  {
    float fracJourney = (Time.time - startTime) * speed.GetValueOrDefault();
    this.transform.position = Vector3.Lerp (origin, destination, fracJourney);
  }
}

Тогда назовите это так:

void Fire() 
{
    GameObject bullet = (GameObject)Instantiate(Bullet, transform.position , transform.rotation);
    BulletBehavior behavior = bullet.GetComponent<BulletBehavior>();
    behavior.origin = this.transform.position;
    behavior.destination = target.transform.position;
    Debug.Log ("FIRE");
}

Примечание: если вы пытаетесь смешать этот подход с попыткой использовать физику для перемещения пули, вы можете получить странные результаты.

person McAden    schedule 26.02.2014
comment
Я пробовал это, это имело смысл, но потом я получил еще одно исключение NullReferenceException (unityengine.Transform.get_position () - person ; 27.02.2014
comment
Просто уточнил свой ответ. Нет смысла использовать сопрограмму, поскольку с ней, вероятно, будет больше логики. Кроме того, если вы уничтожаете пулю в другом месте, это, вероятно, испортит сопрограмму. - person McAden; 27.02.2014
comment
Я никогда не видел этого раньше (иначе я бы попытался выяснить это сам, спасибо за помощь), поэтому я подумал, что опубликую это: ошибка CS0266: Не удается неявно преобразовать тип float? держаться на плаву. Существует явное преобразование (вам не хватает приведения?) Я видел, что вы использовали оператор, с которым я не знаком (??) Я видел (?) Раньше, но никогда не удваивал. Так что я предполагаю, что это может иметь какое-то отношение к этому? - person ; 27.02.2014
comment
упс, поправил в функции обновления на .GetValueOrDefault(). float? - это сокращение от Nullable<float>. ?? - это оператор объединения. - person McAden; 27.02.2014
comment
Я буквально закомментировал свой сценарий Bullet, так что не думаю, что больше использую физику для его перемещения. - person ; 27.02.2014