我在制作躲避球游戏时遇到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");
}
}
玩家预制:突出显示的部分是玩家的实际身体:
播放器预制件突然爆炸:
PLAYER1:
FPSController:
FirstPersonCharacter:
胶囊:
答案 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)
{
}
函数中的所有内容都保持不变。