【发布时间】:2020-10-29 03:32:21
【问题描述】:
我正在尝试在 Unity 中创建一个适用于 2D 和 3D 刚体的类。一切正常,直到我得到一个 InvalidCastException 的“addForce”方法,因为我要么将 2D 转换为 3D,反之亦然。对于那些不知道的人,Rigidbody 和 Rigidbody2D 都有 'addForce' 方法。
我研究了动态类型(而不是使用,因为它不适用于 ios)、泛型和接口,但仍然无法找到解决方案。将不胜感激任何帮助。谢谢。
public class Scroller : MonoBehaviour {
ScrollController _scrollController;
Object _rb;
public enum SCROLL_MODE {
TRANSLATION,
PHYSICS_2D = 2,
PHYSICS_3D = 3
}
public SCROLL_MODE scrollMode = SCROLL_MODE.TRANSLATION;
// Start is called before the first frame update
void Start() {
_scrollController = ScrollController.Instance;
switch (scrollMode) {
case SCROLL_MODE.TRANSLATION:
break;
case SCROLL_MODE.PHYSICS_2D:
_rb = GetComponent<Rigidbody2D>();
break;
case SCROLL_MODE.PHYSICS_3D:
_rb = GetComponent<Rigidbody>();
break;
}
if (!_scrollController)
logFatalError("Error: There is no ScrollController within the scene.");
}
void Update() {
if (scrollMode == SCROLL_MODE.TRANSLATION)
transform.Translate(_scrollController.scrollDirection * _scrollController.scrollSpeed * Time.deltaTime);
}
void FixedUpdate() {
if (scrollMode == SCROLL_MODE.PHYSICS_2D || scrollMode == SCROLL_MODE.PHYSICS_3D) {
if (!_rb) {
logFatalError("Error: " + gameObject.name + " has no Rigidbody" + scrollMode.ToString("d") + "D");
return;
}
applyScrollForce(_rb);
}
}
void applyScrollForce(Object rb) {
((Rigidbody)rb).AddForce(_scrollController.scrollDirection * _scrollController.scrollSpeed * Time.fixedDeltaTime);
}
void logFatalError(string msg) {
Debug.Log(msg);
enabled = false;
}
}
【问题讨论】:
-
回到牛顿定律:F = ma。在两个 2D 中,没有质量。那么如何增加力量呢?在 2D 中,您只需假设质量是常数。因此,当您从 2D 转到 3D 时,您只需使 Z = 0。当从 3D 转到 2D 时,您必须找到重心,这样您就可以给对象一个均匀的质量,并从加速度中移除 Z 元素。
标签: c# unity3d 3d 2d rigid-bodies