射弹同时将墙和“咕gr声”检测为“咕gr声”

时间:2019-11-15 16:52:58

标签: c# unity3d

我有一个从玩家身上发射的弹丸预制件,当它与“边界”碰撞时,它应该自我毁灭,而当它碰到“咕gr声”时,它应该是毁灭自己和咕gr声。但是,当它撞到边界时,它会自我毁灭,并破坏边界的对撞机。我创建了一个自定义标签脚本,该脚本允许我将多个标签分配给一个游戏对象,而不仅仅是一个。

为什么它会破坏撞墙机? 为什么它将墙壁和咕unt声都检测为咕unt声? 我该如何解决?

这是导致问题的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyProjectile : MonoBehaviour
{

    // Start is called before the first frame update
    void Start()
    {

    }

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

    }

    //FIX detects only grunt
    private void OnTriggerEnter(Collider other)
    {
        //Get Tag Component
        Tags hitObject = other.GetComponent<Tags>();

        //Collisions
        if (hitObject.FindTag("boundary"))
        {
            //collision with wall
            Debug.Log("Hit a Wall");
            Destroy(gameObject);
        }
        else if (hitObject.FindTag("grunt"))
        {
            //collision with grunt
            Debug.Log("Hit a Grunt");
            Destroy(gameObject);
            Destroy(other); //<---- Deletes Boundary Collider (Should be destroying the game object of the grunt, instead destroys the colliders of barriers and the grunt)
        }
    }
}

这是自定义标记脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tags : MonoBehaviour
{
    public string[] startTags;
    private static string[] tags;

    private void Start()
    {
        tags = startTags;
    }

    public bool FindTag(string search)
    {
        bool results = false;
        for (int i = 0; i < tags.Length; i++)
        {
            if(search == tags[i])
            {
                results = true;
                break;
            }
        }
        return results;
    }
}

Enemy Grunt Inspector

Wall Inspector

Projectile Inspector

1 个答案:

答案 0 :(得分:2)

看起来您有两个问题。

1)首先,您的弹丸正在摧毁咕unt声的对撞机,而不是咕the声。这是因为您将对撞机传递给了destroy函数,而不是咕gr声:

Destroy(other);

代替使用

Destroy(other.gameobject);

我也将此放在

之前
Destroy(gameObject);

2)您的标签系统无法正常工作。我的猜测是,这是因为

private static string[] tags;

是静态的。我将删除静态修饰符,看看它是否有效。您也可以直接使用startTags,而无需进行start()分配。

Unity也已经有一个标签系统,可能更适合这种检测: https://docs.unity3d.com/Manual/Tags.html