Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改多维数据集';与字符控制器冲突时的s颜色/C#_C#_Unity3d - Fatal编程技术网

更改多维数据集';与字符控制器冲突时的s颜色/C#

更改多维数据集';与字符控制器冲突时的s颜色/C#,c#,unity3d,C#,Unity3d,我最近开始学习如何编写代码,我真的很喜欢,我有点卡住了,我希望得到你的帮助。我补充说: 飞机 角色控制器(在层次结构中命名为“Matt”) 立方体(按键时颜色应变为红色,如果 角色控制器与脚本上的碰撞器碰撞 已附加到多维数据集 我希望立方体改变它的颜色,如果R键被按下(这是有效的),或者如果播放器控制器与立方体的碰撞器发生碰撞 下面是我的场景截图 使用UnityEngine; 使用系统集合; 公共类颜色变化:单一行为 { 公共游戏对象立方体; 私人渲染器rend; //用于初始化 无效开始

我最近开始学习如何编写代码,我真的很喜欢,我有点卡住了,我希望得到你的帮助。我补充说:

  • 飞机
  • 角色控制器(在层次结构中命名为“Matt”)
  • 立方体(按键时颜色应变为红色,如果 角色控制器与脚本上的碰撞器碰撞 已附加到多维数据集
我希望立方体改变它的颜色,如果R键被按下(这是有效的),或者如果播放器控制器与立方体的碰撞器发生碰撞

下面是我的场景截图

使用UnityEngine;
使用系统集合;
公共类颜色变化:单一行为
{
公共游戏对象立方体;
私人渲染器rend;
//用于初始化
无效开始()
{
}
//每帧调用一次更新
无效更新()
{
//这将使对象在按键时改变颜色
if(Input.GetKeyDown(KeyCode.R))
GetComponent().material.color=color.red;
打印(“按下红色键”);
}
无效碰撞中心(碰撞柱)
{
如果(col.collider.name==“Matt”)
{
rend.material.color=color.yellow;
}
}
}
以下是两个对象上属性的屏幕截图:


碰撞检测的复杂性在于,您使用的是角色控制器,而该控制器在Unity的物理模拟中并不起作用。因此,在角色控制器和普通碰撞器之间的碰撞期间,将永远不会调用
OnCollisionCenter()

听起来你需要的是方法。根据文件:

OnControllerColliderHit在控制器执行移动时命中碰撞器时调用

但是,请注意,接收事件的是角色控制器,而不是它撞到的对象。因此,如果您确实修改代码以使用此功能,则需要将事件与控制器一起放置在游戏对象上,并从此处检测/更改多维数据集的渲染器颜色:

void OnControllerColliderHit(ControllerColliderHit col) {
    if (col.collider.name == "cube")
    {
        col.gameObject.GetComponent<Renderer>().material.color = Color.yellow;
    }
}
ControllerColliderHit无效(ControllerColliderHit列){
if(col.collider.name==“立方体”)
{
col.gameObject.GetComponent().material.color=color.yellow;
}
}
注意:由于与使用Unity的角色控制器相关的所有物理问题,您可能实际上想要使用刚体和胶囊碰撞器创建自己的版本。这将需要更多的脚本编写,但Unity提供的解决方案确实无法与引擎的其他部分配合使用


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

首先,如果您要检测碰撞,则立方体上的碰撞器不应触发。如果要将其用作触发器,则应使用OnTiggerEnter方法。无论如何,请将另一个碰撞器(如球体碰撞器)附加到角色控制器,确保它不是触发器,并且您是正确的。使用GetComponent()类似以下内容:

void OnCollisionEnter(Collision col)
{
    if (col.gameObject.tag == "Player")
    {
        GetComponent<Renderer>().material.color = Color.yellow;
    }
}
void OnCollisionEnter(冲突列)
{
如果(col.gameObject.tag==“玩家”)
{
GetComponent().material.color=color.yellow;
}
}

您需要使用OnTiggerCenter而不是OnCollisionCenter 因为你的立方体不是真的实心(因为你在框碰撞器中启用了触发器布尔值)

void ontriggenter(碰撞器其他)
{
if(other.name==“多维数据集”)
{
transform.parent.GetComponent().material.color=color.red;
}
}
还可以尝试在很多地方使用Debug.Log,以确保您是否正在执行

那也许行

更新: 关于rend变量,因为它是私有的,所以在执行颜色更改之前需要分配它,因为没有分配它,所以会得到一个NullReferenceException(rend变量) 将其公开并在inspector中分配,或在Start()中执行:

rend=GetComponent();

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

using UnityEngine;
使用系统集合

公共类颜色变化:单一行为{

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");
    }
}
公共材料color002;
//用于初始化
无效开始(){
}
//每帧调用一次更新
无效更新(){
//这将使对象在按键时改变颜色
if(Input.GetKeyDown(KeyCode.R)){
GetComponent().material.color=color.red;
Log(“按R键表示红色”);
//这将使对象在按键时更改材质
}else if(Input.GetKeyDown(KeyCode.P)){
GetComponent().material=color002;
Debug.Log(“按P键查看粉色材质(color002)”;
}
}
//如果FPS控制器与立方体游戏对象发生碰撞,这将使对象改变颜色
无效对撞机(对撞机其他)
{
印刷品(其他名称);
if(other.name==“FPSController”)
{
GetComponent().material.color=color.green;
Log(“FPS与多维数据集冲突”);
}
}
}


非常感谢你的帮助!继续编码的时间:D

如果(col.collider.name==“Matt”)
当你到达这一行时,使用调试器验证名称是什么,你甚至在哪里分配了collider.name..?你的刚体组件之一是否标记为运动学?运动学刚体在物理模拟中不检测碰撞…我现在在代码中添加了print语句,碰撞器也应用于立方体,并且没有脚本应用于播放器控制器。对不起,我对编码很陌生,如果我有任何挫折,请原谅我。void OnCollisionEnter(Collision col){if(col.collider.name==“Matt”){print(col.collider.name);rend.material.color=color.yellow;}}@Serlite我的玩家控制器的刚体标记为运动学,我尝试取消选中它,但一旦碰撞,它仍然不会触发立方体上的另一种颜色。如果添加日志作为第一个lin
rend = GetComponent<Renderer>();
using UnityEngine;
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");
    }
}