Unity3D在没有OnCollisionEnter的情况下检查冲突

问题描述 投票:0回答:3

我在游戏中使用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> ());
}

射击

t_barrel.LookAt (hitPoint);
MonoBehaviour.Instantiate (g_kubik, t_barrel.position, t_barrel.rotation);
unity3d collision raytracing
3个回答
1
投票

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


1
投票

你需要做的是在你的BulletScript上添加一个名为direction的场,让子弹射向一个方向以外的方向。这就是为什么你的子弹达到了这一点,无处可去。

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

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> ();
        BulletScript bullet = Instantiate (g_kubik, t_barrel.position, t_barrel.rotation) as BulletScript;
        bullet.direction = (cele [i].point - t_barrel.position).normalized;
        bullets.Add (bullet);


    }
}

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 += bullets [i].direction * speed * Time.deltaTime;
    }

}

0
投票

为团队本身设置敌人/目标的标签。例如,让我们将敌方游戏对象的标记设置为“EnemyObj”。然后,在项目符号代码中使用以下伪代码:

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> ());
}
© www.soinside.com 2019 - 2024. All rights reserved.