【问题标题】:Changing Cube's Color on Collision with Character Controller / C#与角色控制器/C#发生碰撞时更改立方体的颜色
【发布时间】:2019-12-05 23:20:27
【问题描述】:

我最近开始学习如何编码,我真的很喜欢它,我有点卡住了,我希望得到你的帮助。我已添加:

  • 一架飞机
  • 角色控制器(在层次结构中命名为“Matt”)
  • 一个立方体(它应该在按键时将颜色变为红色,并且如果 角色控制器与立方体上的对撞机发生碰撞)+脚本 附在立方体上

如果按下 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;
        }
    }
}

这是两个对象的属性截图:

【问题讨论】:

  • if (col.collider.name == "Matt") 使用调试器验证名称是什么,当您到达这一行时,您甚至在哪里分配 collider.Name..?
  • 您的刚体组件之一是否标记为运动学?运动学刚体不检测物理模拟中的碰撞...
  • 我现在在代码中添加了打印语句,碰撞器也应用于立方体,并且没有脚本应用于播放器控制器。对不起,我对编码很陌生,如果我有任何挫败感,请原谅我。 void OnCollisionEnter (Collision col) { if (col.collider.name == "Matt") { print (col.collider.name); rend.material.color = 颜色.黄色; } }
  • @Serlite 我的播放器控制器的刚体被标记为运动学,我尝试取消选中它,但一旦碰撞它仍然不会触发我的立方体上的另一种颜色。
  • 如果您将日志记录添加为OnCollisionEnter 的第一行,它甚至会被调用吗?如果没有,请向我们展示您尝试检测碰撞的两个对象的属性的屏幕截图。

标签: c# unity3d


【解决方案1】:

碰撞检测的复杂之处在于您使用的是角色控制器,它在 Unity 的物理模拟中并不完全有效。因此,OnCollisionEnter() 在角色控制器和普通碰撞器之间的碰撞过程中永远不会被调用。

听起来您需要的是OnControllerColliderHit() 方法。根据文档:

OnControllerColliderHit 在控制器在执行移动时碰到碰撞器时调用。

但是,请注意接收事件的是角色控制器,而不是它碰到的对象。因此,如果您确实修改了代码以使用它,则需要将事件放在带有控制器的 GameObject 上,并从那里检测/更改立方体的渲染器颜色:

void OnControllerColliderHit(ControllerColliderHit col) {
    if (col.collider.name == "cube")
    {
        col.gameObject.GetComponent<Renderer>().material.color = Color.yellow;
    }
}

注意:由于与使用 Unity 的角色控制器相关的所有与物理相关的难题,您实际上可能希望使用刚体和胶囊对撞机创建自己的版本。这需要更多的脚本编写,但 Unity 提供的解决方案确实不能很好地与引擎的其他部分配合使用。

希望这会有所帮助!如果您有任何问题,请告诉我。

【讨论】:

  • 这个方法在碰到常规对撞机时也会被调用吗?该参数使它看起来只能与另一个角色控制器一起使用...
  • @Eddge 它应该适用于与普通碰撞器的碰撞 - ControllerColliderHit 只是关于被碰撞对象(以及撞击它的控制器)的各种数据的包装器。
  • @Serlite 我会再试一次,回来找你,非常感谢你的支持!
【解决方案2】:

首先,如果您要检测碰撞,则不应触发立方体上的碰撞器。如果要将其用作触发器,则应使用 OnTriggerEnter 方法。无论如何,将另一个对撞机(如球体对撞机)附加到角色控制器上,确保它没有被触发并且你很好。像这样使用 GetComponent():

void OnCollisionEnter(Collision col)
{
    if (col.gameObject.tag == "Player")
    {
        GetComponent<Renderer>().material.color = Color.yellow;
    }
}

【讨论】:

【解决方案3】:

您需要使用 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>();

【讨论】:

    【解决方案4】:

    好的,伙计们,我已经成功了。下面是我的最终代码:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多