我最近开始学习如何编码,我真的很喜欢它,我很困惑,我想得到你的帮助。我添加了:
如果按下R键(可行)或玩家控制器与立方体对撞机发生碰撞,我希望CUBE改变它的颜色。
下面我的场景截图
using UnityEngine;
using System.Collections;
public class colorChange : MonoBehaviour
{
public GameObject cube;
private Renderer rend;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
// This will get the OBJECT to CHANGE COLOR on KEY PRESS
if (Input.GetKeyDown (KeyCode.R))
GetComponent<Renderer> ().material.color = Color.red;
print ("A Key Pressed For Red Color");
}
void OnCollisionEnter (Collision col)
{
if (col.collider.name == "Matt")
{
rend.material.color = Color.yellow;
}
}
}
以下是两个对象的属性截图:
答案 0 :(得分:1)
碰撞检测的复杂性在于您使用的是字符控制器,它在Unity的物理模拟中并不完全有效。因此,在角色控制器和普通对撞机之间的碰撞过程中永远不会调用OnCollisionEnter()
。
听起来你需要的是OnControllerColliderHit()
方法。根据文件:
当控制器在执行移动时击中对撞机时,将调用OnControllerColliderHit。
但是,请注意它是接收事件的角色控制器,而不是它碰到的对象。因此,如果您修改代码以使用它,则需要使用控制器将事件放在GameObject上,并从那里检测/更改多维数据集的渲染器颜色:
void OnControllerColliderHit(ControllerColliderHit col) {
if (col.collider.name == "cube")
{
col.gameObject.GetComponent<Renderer>().material.color = Color.yellow;
}
}
注意:由于与使用Unity的角色控制器相关的所有与物理相关的麻烦,您实际上可能想要使用Rigidbody和胶囊对撞机创建自己的版本。这将需要更多的脚本,但Unity提供的解决方案实际上并不适用于引擎的其他部分。
希望这有帮助!如果您有任何问题,请告诉我。
答案 1 :(得分:0)
首先,如果您要检测碰撞,那么立方体上的对撞机不应该被触发。如果要将其用作触发器,则应使用OnTriggerEnter方法。无论如何,连接到角色控制器的另一个对撞机就像球体对撞机一样,确保它不会触发,你就是好的。使用像这样的GetComponent():
void OnCollisionEnter(Collision col)
{
if (col.gameObject.tag == "Player")
{
GetComponent<Renderer>().material.color = Color.yellow;
}
}
答案 2 :(得分:0)
您需要使用OnTriggerEnter而不是OnCollisionEnter 导致您的立方体不是真正的固体(导致你在盒子对撞机中启用了触发器布尔值)
void OnTriggerEnter(Collider other)
{
if(other.name=="Cube")
{
transform.parent.GetComponent<Renderer>().material.color = Color.red;
}
}
也尝试在很多地方使用Debug.Log来确保你是否正在执行。
那可能会这样做。
更新: 关于rend变量,因为你私有它需要在执行颜色更改之前分配它,你会得到一个NullReferenceException,因为它没有被赋值(rend var) 将其公开并在检查器中分配或在Start()中进行:
rend = GetComponent<Renderer>();
答案 3 :(得分:0)
好的伙计们,我已经设法让它发挥作用。以下是我的最终代码:
using UnityEngine;
使用System.Collections;
公共类colorChange:MonoBehaviour {
public Material color002;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
// This will get the OBJECT to CHANGE COLOR on KEY PRESS
if (Input.GetKeyDown (KeyCode.R)) {
GetComponent<Renderer> ().material.color = Color.red;
Debug.Log ("R Key Press For RED");
// This will get the OBJECT to CHANGE MATERIAL on KEY PRESS
} else if (Input.GetKeyDown (KeyCode.P)) {
GetComponent<Renderer> ().material = color002;
Debug.Log ("P Key Press For Pink Material (color002)");
}
}
// This will get the OBJECT to CHANGE COLOR if the FPS Controller collides with Cube GameObject
void OnTriggerEnter(Collider other)
{
print (other.name);
if(other.name=="FPSController")
{
GetComponent<Renderer>().material.color = Color.green;
Debug.Log ("FPS Collided with CUBE");
}
}
}
非常感谢你的帮助!是时候继续编码了:D