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