c# - 如何检查 GameObject 是否包含网格渲染器但不包含任何碰撞器,然后向其添加碰撞器?
问题描述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AddColliders : MonoBehaviour
{
public List<GameObject> objectsToAddCollider = new List<GameObject>();
// Start is called before the first frame update
void Start()
{
AddDescendantsWithTag(transform, objectsToAddCollider);
}
// Update is called once per frame
void Update()
{
}
private void AddDescendantsWithTag(Transform parent, List<GameObject> list)
{
foreach (Transform child in parent)
{
if (child.gameObject.GetComponent<MeshRenderer>() != null
&& child.gameObject.GetComponent<)
{
list.Add(child.gameObject);
}
AddDescendantsWithTag(child, list);
}
}
}
在这一行,我正在检查游戏对象是否附加了一个网格渲染器,但是如何检查它是否没有附加任何碰撞器类型?然后如何向它添加网格对撞机?
这是我到目前为止所尝试的:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AddColliders : MonoBehaviour
{
public List<GameObject> objectsToAddCollider = new List<GameObject>();
// Start is called before the first frame update
void Start()
{
AddDescendantsWithTag(transform, objectsToAddCollider);
}
// Update is called once per frame
void Update()
{
}
private void AddDescendantsWithTag(Transform parent, List<GameObject> list)
{
foreach (Transform child in parent)
{
if (child.gameObject.GetComponent<MeshRenderer>() != null
&& child.gameObject.GetComponent<Collider>() == null)
{
child.gameObject.AddComponent<MeshCollider>();
list.Add(child.gameObject);
}
AddDescendantsWithTag(child, list);
}
}
}
但是最后在添加断点的时候就行了:
AddDescendantsWithTag(transform, objectsToAddCollider);
我在 Collider 中看到 List objectsToAddCollider 中的游戏对象这条消息:
collider = System.NotSupportedException: collider 属性已被弃用
解决方案
GameObject.collider
在 2019.1.0 版本中已弃用并删除。
你不能再用它来调试了。
检查是否有Collider
任何类型的使用
var collider = child.GetComponent<Collider>();
简单地检查它是否存在你也可以做
if(child.GetComponent<Collider>())
{
Debug.Log("Collider found");
}
再次因为(或者更好地说它继承自Collider
Unity 的类型)实现了一个隐式运算符equals 。Object
bool
!= null
因此,如果组件不存在于单行中,则添加组件的一种非常好的方法是
Collider collider = child.GetComponent<Collider>() ? collider : child.gameObject.AddComponent<Collider>();
甚至略短
Collider collider = child.GetComponent<Collider>() ?? child.gameObject.AddComponent<Collider>();
注意:在智能手机上打字,所以没有保修,但我希望这个想法很清楚。
推荐阅读
- visual-studio-code - 有没有办法在 VDI 中保留 VS Code 扩展?
- db2 - 如何使用 IBM Data Server Driver 和量角器连接大型机 DB2?什么是连接字符串?
- python - 如何在 python setup.py 中使用忽略安装
- javascript - 如何在联系表单中阻止文本区域上的 URL?
- html - 使用 CSS 的文本滑块
- android - 如何从所有布局中隐藏状态栏?
- angular - 使用 RxJs map 将一种类型的数组转换为另一种类型的数组
- sql-server - 从子表聚合结果的 SQL 查询
- azure - 如何使用 Xamarin 流式传输存储在 Azure 存储 Blob 中的视频
- angular - Angular 8:在子组件中选择浏览器后退按钮时恢复滚动位置