Unity3D在没有OnCollisionEnter

时间:2015-09-06 17:19:29

标签: unity3d collision raytracing

我在游戏中使用gameobjects作为子弹,但我可能做得不好。我从我的枪管中投射光线,实例化对象并通过Transform.MoveTowards()将其移动到RaycastHit.point。问题是当我向敌人开枪时,它会在子弹到达之前移动,因为子弹永远漂浮在空中。我在那里看到两个解决方案:我可以检查子弹是否有问题,但我不知道如何为数百个子弹提供一个仅为OnCollisionEnter每帧完成的脚本是一个坏主意。第二种方法是每帧改变目标位置,但我不知道如何保存它。 我该怎么做?

public static List <GameObject> bullets = new List <GameObject> ();
    public static List <Vector3> targets = new List <Vector3> ();

public override void Shot (Vector3 hitPoint) {
for (int i = 0; i < raysNumber; i++) {
            direction = new Vector3 (UnityEngine.Random.Range (-splash, splash), UnityEngine.Random.Range (-splash, splash), 100);
            direction = t_barrel.TransformDirection (direction);
            if (Physics.Raycast (t_barrel.position, direction, out cele[i], 100, layer)) {

                EnemyFPS enemyHealth = cele[i].collider.GetComponent <EnemyFPS> ();
                bullets.Add (MonoBehaviour.Instantiate (g_kubik, t_barrel.position, t_barrel.rotation) as GameObject);
                targets.Add (cele [i].point);


            }
        }

public override void MoveBullets () {
        if (bullets.Count > 150) {
            bullets.RemoveAt (0);
            targets.RemoveAt (0);
        }
        for (int i = 0; i < bullets.Count; i++) {

            bullets [i].transform.position = Vector3.MoveTowards (bullets [i].transform.position, targets [i] * 10, 1f);
        }

    }

每帧调用MoveBullets。

编辑:我的问题图片: enter image description here

子弹:

Vector3 pro;
float speed = 10;

void Start () {
    pro = transform.InverseTransformDirection (transform.forward);
}

void Update () {
    transform.Translate (pro * speed * Time.deltaTime);
}

void OnTriggerEnter (Collider other) {
    Debug.Log ("Collision");
    EnemyFPS enemy = other.gameObject.GetComponent <EnemyFPS> ();
    if (enemy != null) {
        enemy.TakeDamage (5);
        other.gameObject.transform.SetParent (other.transform);
    }
    GetComponent<Collider>().gameObject.GetComponent <Collider> ().enabled = false;
    Destroy (gameObject.GetComponent <BulletS> ());
}

Shoting

t_barrel.LookAt (hitPoint);
MonoBehaviour.Instantiate (g_kubik, t_barrel.position, t_barrel.rotation);

3 个答案:

答案 0 :(得分:1)

如果您完全遵循Unity3d太空射击教程,我相信您的所有疑问都将得到解决。这是它的link 我所理解的以及你基本上需要做的是为你的敌人添加一个对撞机,以便当子弹触及敌人时,会发生一些事情。就像,敌人死亡或受伤,当然子弹被摧毁,除非它是狙击步枪子弹,有时可以穿透头骨并杀死第一个敌人后面的另一个敌人,但这是更先进的。 或者,您可以限制每帧可以生成的项目符号数。

答案 1 :(得分:1)

您需要做的是在名为BulletScript的{​​{1}}中添加一个字段,然后让子弹向一个方向射击。这就是为什么你的子弹达到了这一点并且无处可去。

direction

答案 2 :(得分:0)

以统一方式为敌人/目标设置标记。例如,让我们将敌方游戏对象的标记设置为&#34; EnemyObj&#34;。 然后,在项目符号代码中使用以下伪代码:

void OnTriggerEnter (Collider other) {
//Compare the tag of the Collider other object with "EnemyObj" using compare tag method
//If it is true then..
//Do something like decrease health
//Finally call  Destroy (gameObject.GetComponent <BulletS> ());
}