Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3D碰撞检测不工作_C#_Unity3d - Fatal编程技术网

C# Unity3D碰撞检测不工作

C# Unity3D碰撞检测不工作,c#,unity3d,C#,Unity3d,在进行躲避球游戏时,我在OnCollisionCenter方面遇到了困难,所以当玩家被特定颜色的球击中时,我有没有办法让玩家失去生命/点数 我所尝试的: 播放机上的脚本: void Start () { livesText = GameObject.FindWithTag("lives").GetComponent<Text>(); lives = 4; } // Update is called once per frame void Update ()

在进行躲避球游戏时,我在OnCollisionCenter方面遇到了困难,所以当玩家被特定颜色的球击中时,我有没有办法让玩家失去生命/点数

我所尝试的:

播放机上的脚本:

    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");

      }


}
void Start(){
livesText=GameObject.FindWithTag(“lives”).GetComponent();
寿命=4;
}
//每帧调用一次更新
无效更新(){
livesText.text=“生活:”+生活;
}
无效碰撞中心(碰撞bol)
{
如果(bol.gameObject.name==“蓝球”)
{
生命=生命-1;
Log(“冲突”);
}
}

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

    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");

      }


}

玩家预制的分解:

播放者1:

FPS控制器:

FirstPersonCharacter:

胶囊:


根据颜色是在游戏过程中生成的还是使用已经存在的颜色,您可以通过两种方式执行此操作

方法1

为每种颜色创建标记,然后确保在编辑器中为每个对象指定了标记。使用
CompareTag
比较它与哪个颜色冲突

这是一个关于如何创建标记的快速教程

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

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

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");
    }
}

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

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

方法1

为每种颜色创建标记,然后确保在编辑器中为每个对象指定了标记。使用
CompareTag
比较它与哪个颜色冲突

这是一个关于如何创建标记的快速教程

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

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

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");
    }
}

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

提供您尝试过的内容。您可以通过的参数访问“我们正在碰撞其碰撞器的游戏对象”,这将帮助您实现目标。请记住,您可能不应该将您的游戏逻辑与球的实际颜色联系起来(因为这种解决方案的可维护性较低)-例如,请使用标记。@OusmaneMahyDiaw我已经编辑了我的问题并提供了我尝试过的内容。@apk我只是尝试使用“if”(col.gameObject.tag==“player”)“在球上,我仍然没有得到碰撞检测。在我的问题中,我编辑并放置了我以前尝试过的内容。请提供您尝试过的内容。您可以通过的参数访问“我们正在碰撞其碰撞器的游戏对象”,这将帮助您实现目标。请记住,您可能不应该将您的游戏逻辑与球的实际颜色联系起来(因为这种解决方案的可维护性较低)-例如,请使用标记。@OusmaneMahyDiaw我已经编辑了我的问题并提供了我尝试过的内容。@apk我只是尝试使用“if”(col.gameObject.tag==“player”)“在球上,我仍然没有得到碰撞检测。我编辑并在我的问题中加入了我以前尝试过的内容。我只是尝试了“(bol.gameObject.CompareTag(“蓝球”)'这样做的方法,我仍然没有得到碰撞检测。我现在将尝试检查颜色的阈值。您好,请观看我链接的视频,了解如何创建标记。您没有正确执行此操作。创建标记后,您必须选择具有不同颜色的每个对象并更改其标记。请确保从Edi更改其标记tor.完整地观看该视频。另外,确保标记名与代码中的标记匹配。这应该是现成的。此外,我已经添加了有关如何使用阈值的完整信息,如果你想走这条路线。请查看。嗨@Programmer,我知道这应该可行,我确实更改了(蓝色)球的标记(我现在只有一个球)在编辑器中…但我附加了一个球员预制的屏幕截图,我认为我如何构造球员肯定有问题,因为没有一个碰撞检测方法在使用它。我将在我发布此评论后通过编辑问题提供更多细节。你的球的屏幕截图显示你没有改变e标记。请更改标记,然后更新屏幕截图。很抱歉,我忘了提到在球的开始功能中,我设置了“gameObject.tag=”active“,使其开始时处于活动状态,然后在接触地面时变为“未标记”。因此,在运行期间,球的标记会发生变化,脚本仍然不起作用。如果有帮助,我还在问题中插入了球员预设的分解。如果这真的很复杂,请道歉,并感谢您迄今为止所花的时间。我刚刚尝试了(bol.gameObject.CompareTag(“蓝球”)'这样做的方法,我仍然没有得到碰撞检测。我现在将尝试检查颜色的阈值。您好,请观看我链接的视频,了解如何创建标记。您没有正确执行此操作。创建标记后,您必须选择具有不同颜色的每个对象并更改其标记。请确保从Edi更改其标记tor.完整地观看该视频。另外,确保标记名与代码中的标记匹配。这应该是现成的。此外,我已经添加了有关如何使用阈值的完整信息,如果你想走这条路线。请查看。嗨@Programmer,我知道这应该可行,我确实更改了(蓝色)球的标记(我只有一个