Unity3D碰撞检测不起作用

时间:2017-03-22 23:28:12

标签: c# unity3d

我在制作躲避球游戏时遇到OnCollisionEnter有困难,所以有什么方法可以让玩家在用特定颜色的球击中时失去生命/分数?

我尝试了什么:

播放器上的脚本:

    void Start () {
    livesText = GameObject.FindWithTag("lives").GetComponent<Text>();
    lives = 4;

}

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

    livesText.text = "Lives: " + lives;
}

void OnCollisionEnter(Collision bol)
{
     if (bol.gameObject.name == "blueBall")
    {

      lives = lives - 1;

      Debug.Log("Collided");

      }


}

enter image description here

enter image description here

玩家预制:突出显示的部分是玩家的实际身体:

enter image description here

播放器预制件突然爆炸:

PLAYER1:

enter image description here

FPSController:

enter image description here

FirstPersonCharacter:

enter image description here

胶囊:

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以通过两种方式执行此操作,具体取决于在游戏过程中是否生成颜色或使用已存在的颜色。

方法1

为每种颜色创建一个标签,然后确保每个对象都在编辑器中分配了它的标签。使用CompareTag比较与之碰撞的颜色。

Here是一个关于如何创建标签的快速教程。

void OnCollisionEnter(Collision bol)
{
    if (bol.gameObject.CompareTag("blueBall"))
    {
        lives = lives - 1;
        Debug.Log("Collided red");
    }
    else if (bol.gameObject.CompareTag("greenBall"))
    {
        lives = lives - 2;
        Debug.Log("Collided green");
    }

    else if (bol.gameObject.CompareTag("blackBall"))
    {
        lives = lives - 3;
        Debug.Log("Collided black");
    }
}

方法2

现在,如果你正在做一些高级操作,你必须在运行时生成颜色,你必须检查颜色的阈值。有一个关于这个here的问题,我移植了Unity的代码。

public double ColourDistance(Color32 c1, Color32 c2)
{
    double rmean = (c1.r + c2.r) / 2;
    int r = c1.r - c2.r;
    int g = c1.g - c2.g;
    int b = c1.b - c2.b;
    double weightR = 2 + rmean / 256;
    double weightG = 4.0;
    double weightB = 2 + (255 - rmean) / 256;
    return System.Math.Sqrt(weightR * r * r + weightG * g * g + weightB * b * b);
}

然后在碰撞回调函数中执行类似的操作:

void OnCollisionEnter(Collision bol)
{
    MeshRenderer ballMesh = bol.gameObject.GetComponent<MeshRenderer>();

    if (ColourDistance((Color32)ballMesh.sharedMaterial.color, (Color32)Color.red) < 300)
    {
        lives = lives - 1;
        Debug.Log("Collided red");
    }
    else if (ColourDistance((Color32)ballMesh.sharedMaterial.color, (Color32)Color.green) < 300)
    {
        lives = lives - 2;
        Debug.Log("Collided green");
    }

    else if (ColourDistance((Color32)ballMesh.sharedMaterial.color, (Color32)Color.black) < 300)
    {
        lives = lives - 3;
        Debug.Log("Collided black");
    }
}

修改

由于您使用的是第一人称控制器,因此未调用OnCollisionEnter函数。

在这种情况下,您必须使用OnControllerColliderHit功能。

void OnControllerColliderHit(ControllerColliderHit bol)
{

}

函数中的所有内容都保持不变。