C# Unity3D碰撞检测不工作
在进行躲避球游戏时,我在OnCollisionCenter方面遇到了困难,所以当玩家被特定颜色的球击中时,我有没有办法让玩家失去生命/点数 我所尝试的: 播放机上的脚本: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 ()
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,我知道这应该可行,我确实更改了(蓝色)球的标记(我只有一个