使用字符控制器/ C#更改多维数据集的碰撞颜色

时间:2017-01-26 19:26:45

标签: c# unity3d

我最近开始学习如何编码,我真的很喜欢它,我很困惑,我想得到你的帮助。我添加了:

  • 一架飞机
  • 角色控制器(命名为'马特'在层次结构中)
  • 一个立方体(在按键时应该将颜色改为红色,如果是 角色控制器与立方体上的碰撞器碰撞+脚本 附加到立方体

如果按下R键(可行)或玩家控制器与立方体对撞机发生碰撞,我希望CUBE改变它的颜色。

  

下面我的场景截图

enter image description here

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

以下是两个对象的属性截图:

enter image description here

4 个答案:

答案 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