问题描述
- 我创建了Test.cs和TestEditor.cs(Test类是一个简单的类。)
- Test.cs为空,这是TestEditor.cs:
using UnityEngine; using UnityEditor; [CustomEditor(typeof(Test))] public class TestEditor : Editor { Test test; GameObject cube; GameObject sphere; public override void OnInspectorGUI() { base.OnInspectorGUI(); test = (Test)target; if (GUILayout.Button("Create")) { Create(); RayCasttest(); } if (GUILayout.Button("RayCast Test")) { RayCasttest(); } } void Create() { cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position = test.transform.position; sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere.transform.position = test.transform.position + Vector3.right * 5f; } void RayCasttest() { Ray ray; RaycastHit hit; ray = new Ray(test.transform.position,Vector3.right); if (Physics.Raycast(ray,out hit,1000f)) { GameObject target = hit.collider.gameObject; target.transform.localScale *= 2f; } } }
那么,如何使RayCastTest()函数在第一部分中起作用?
解决方法
射线广播来自Physics
引擎。 Afaik它仅在更新一次Physics
之后才起作用,因为在此之前可能尚未重新计算Collider
-> Physics
尚未“知道” Collider
。>
您可以在Create
之后尝试使用Physics.Simulate
强制使用它
if (GUILayout.Button("Create"))
{
Create();
Physics.Simulate(Time.fixedDeltaTime);
RayCastTest();
}
另外,您可能必须禁用Physics.autoSimulation
..不幸的是,API尚不清楚。如果是这样,您可能会这样做
Physics.autoSimulation = false;
Physics.Simulate(Time.fixedDeltaTime);
Physics.autoSimulation = true;
Physics.SyncTransforms
也可能会帮助
当
Transform
组件发生更改时,可能需要重新定位,旋转或缩放Rigidbody
或其子元素上的任何Collider
或Transform
或子元素。Transform
。使用此功能可将这些更改手动刷新到Physics
引擎。
由于要移动创建的对象,因此在模拟之前,可能还必须调用此对象(再次与可能)
if (GUILayout.Button("Create"))
{
Create();
Physics.SyncTransforms();
Physics.autoSimulation = false;
Physics.Simulate(Time.fixedDeltaTime);
Physics.autoSimulation = true;
RayCastTest();
}