c# - 如何复制父对象的旋转保持自旋转,因为它在unity3d中
问题描述
我正在尝试在 3d 平面内实例化一个 3d 平面游戏对象,但是父 3d 平面的旋转可以是任何东西,子平面应该与父 3d 平面完全平行,但它也应该保持自己的旋转。
我尝试了以下脚本,但它不起作用
child.rotation = child.rotation * parent.rotation;
在这里,我有一个子平面游戏对象名称为 B(旋转:-90、0、0),我正在制作另一个更大的平面游戏对象(旋转:任何东西)作为其父级。但是子平面有时会平行于其父平面,有时当父平面处于某个不同的角度/旋转时则不会。
说明:在下面的屏幕截图中,我在编辑器中手动设置了子平面旋转,只需将所需角度旋转 90/180 度,当将该对象从世界拖动到子对象(本地)时,比例会自动调整。
我尝试了下面的代码片段来实现需要,但没有奏效。
var chile = Instantiate(Resources.Load<GameObject>(prefabsPath), parent);
var t = child.transform;
t.position = pos;
t.rotation = parent.rotation;
我也试过
t.forward = parent.forward;
还有这个
child.SetParent(parent); // wasn't passing parent in Instantiate
以上一个在相应的缩放方面工作得很好,但我仍然无法修复旋转。
@derHego 回答,子平面像下面这样被拉伸,我尝试将子平面附加到不同大小的父平面上,我发现它根据父级比例被拉伸,如果父级的 y 大于 x,那么子级的 y 也变得大于它的 x 与父级中的比率相同。我该如何解决?
解决方案
我假设您希望两个平面都面对例如它们的局部Y
轴在同一方向上,而它们仍然可能围绕该面法线相互旋转。
根据您的飞机所面对的方向,您可以使用例如
child.up = parent.up;
Y
在这种情况下,为了使两个平面平行(=指向同一个方向),我假设您的默认平面平放在地板上,因此它朝上
例如
public class Example : MonoBehaviour
{
public Transform child;
private void Start()
{
child.up = transform.up;
}
}
(绿色平面为父级,白色平面为子级)
更新后看起来实际上你可以简单地做
var child = Instantiate(prefab);
child.rotation = parent.rotation;
var scale = child.lossyScale;
child.SetParent(parent);
var invertParentScale = new Vector3(1 / parent.lossyScale.x, 1 / parent.lossyScale.y, 1 / parent.lossyScale.z)
child.localScale = Vector3.Scale(scale, invertParentScale);
推荐阅读
- sage - 如何将计算结果存储在 SageMath 的列表中
- c++ - 绘制具有多纹理的对象和具有一种纹理的其他对象
- java - 通过 Array 使用 selectionsort 对 arraylist 进行排序
- node.js - 调试时VSCode终端切换
- c# - 如何在 C# 中将 XML DataTable xmlns="http://schemas.datacontract.org/2004/07/System.Data" 分配给 DataTable?
- jquery - npm 开发服务器(JQUERY)Symfony 4 的问题
- excel - Excel VBA FOR 循环与 IF 语句以匹配另一列中的数据并附加一个单独的列
- c# - 如何禁止任务被等待中断?
- python - 存在重复项时查找列表之间的差异
- r - 字符值问题