【问题标题】:Unity/C# - Set position and rotation manually of object based on another objectUnity/C# - 根据另一个对象手动设置对象的位置和旋转
【发布时间】:2019-05-20 10:51:07
【问题描述】:

我在 3D 空间中有 3 个对象,但它们只是 3D 对象的 2D 表示。对象 A (Obj-A) 是父对象,还有 2 个不同的对象(Obj-B、Obj-C)作为子对象没有附加到 Obj-A,但我必须像它们的子对象一样移动。我正在移动和旋转 Obj-A,我正在基于 Obj-A 设置 Obj-B 和 Obj-C 的位置,偏移量如下:

objB.transform.position = objA.transform.position + offset;
objC.transform.position = objA.transform.position - offset;

当然,当 Obj-A 旋转时,我希望 Obj-B 和 Obj-C 的位置也受到其旋转的影响。 当我根据与 Obj-A 相同的逻辑旋转 Obj-B 和 Obj-C 时,它们仅在其本地轴上旋转。 基本上它应该是这样的:

我正在开发 Unity,但项目的这一部分是在独立于 Unity 的 C# 脚本上计算的。有了这个,我只能访问对象的变换位置和旋转角度,并且简单地将 Obj-B 和 Obj-C 作为子级添加到 Obj-A 是不可行的。

请帮忙!谢谢!

【问题讨论】:

  • 在执行此操作的地方有很多移动脚本,例如,它会让相机跟随玩家而不是孩子。你不明白的究竟是什么
  • 在右边的两张图片中,C 相对于A 的位置不同,然后在左边的两张图片中......我猜这是一个意外?

标签: c# unity3d game-development


【解决方案1】:

首先你应该像这样复制旋转

objB.transform.rotation = objA.transform.rotation;
objC.transform.rotation = objA.transform.rotation;

那么你应该使用offset 组件与objA 的局部坐标系:

objB.transform.position = objA.transform.position 
                          + offset.x * objA.transform.right
                          + offset.y * objA.transform.up
                          + offset.z * objA.transform.forward;

objB.transform.position = objA.transform.position 
                          - offset.x * objA.transform.right
                          - offset.y * objA.transform.up
                          - offset.z * objA.transform.forward;

【讨论】:

  • 您好,感谢您的回复。我试过了,但不幸的是,这对我不起作用。我在这里并不完全使用 Unity 对象,因此我不得不将它们转换为类似的对象,因为您提到的某些值不可用。例如,它只使用 Transform2D,所以没有 Z 值。
  • 不,您使用的是GameObject.transform,它返回Transform .. 没有像Transform2D 这样的东西。我以您提供的内容为例..如果您必须处理其他类型并且实际上不能使用transform,那么请发布您实际使用的代码的不同示例。
  • 对不起,我不确定我是否可以分享一些实际的 sn-p!但我已经主要根据您的回答和一些小改动发现了这一点。谢谢!
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多