[unity]子物体和父物体的移动同步

本文详细解析了在三维场景中,子物体如何跟随父物体移动的原理。通过实例说明,子物体的坐标系依赖于父物体,确保两者移动时位置关系不变。关键在于理解相对坐标与世界坐标的转换,以及在实际编程中的应用。

子物体和父物体的移动同步

首先明确一个概念,子物体的坐标是以父物体为原点而计算的
在这里插入图片描述
在上图中,绿色球的坐标是(-2.62,6.3,0)这是相对于世界坐标原点。而作为它的子物体cube,cube的坐标是相对坐标,相对于绿色的球的。
"图二"
垃圾
从上面两张图可以看出,cube相对于绿球的坐标是(0.32,-5.43,0),而当cube不是绿球的子物体时,他相对于世界的坐标是(-0.73,-7.19,0)

回归主题
如何在移动绿球的时候,让cube同步移动而不出现偏差?

那么你需要父子物体,在上面的例子中,将z全部设置为0。即俯视图他们应当重叠!!

Unity中,通常物体换是在整个层次结构中进行继承的,当对具有关系的物体进行操作时,可根据不同场景选择合适的方法实现物体移动或旋转时物体相应移动或旋转: - **物体层级关系下的自然继承**:在Unity中,基于物体换在整个层次结构中进行继承的特性,物体物体脚本内使用`CharacterController.Move`方法,不管物体是否拥有`CharacterController`,都会自动跟随物体移动。这是因为此方法移动物体时,实际上移动的是整个物体包括物体[^2]。 - **同步位移操作**:使用`Transform.Translate`方法可以实现物体根据相对于其自身或另一个换的位移向量进行移动。在`LateUpdate`方法中应用计算出的位移向量到所有附着的`Rigidbody`上,由于`LateUpdate`会在所有`Update`方法之后执行,能获取到所有物体的最终位置更新后统一进行位移操作,确保同步位置的准确性。这同样适用于物体动作带动物体同步的情况,这里可在物体控制脚本里对物体执行此逻辑。示例代码如下: ```csharp void LateUpdate() { // 计算物体位移向量,这里简单示例为固定值 Vector3 displacement = new Vector3(0.1f, 0, 0); // 物体自身移动 transform.Translate(displacement); // 物体同步移动 if (transform.parent != null) { transform.parent.Translate(displacement); } } ``` - **基于鼠标输入的旋转同步(以物体旋转带动物体旋转为例)**:若使用鼠标控制物体旋转,可以结合`Unity`的API、`C#`脚本编写与数学原理,实现物体旋转过程中物体同步旋转。思路是先处理鼠标输入得到旋转信息,然后将该旋转信息同时应用到物体物体上。示例代码如下: ```csharp void Update() { if (Input.GetMouseButton(0)) { float mouseX = Input.GetAxis("Mouse X"); float mouseY = Input.GetAxis("Mouse Y"); Vector3 rotation = new Vector3(mouseY, mouseX, 0); // 物体旋转 transform.Rotate(rotation); // 物体同步旋转 if (transform.parent != null) { transform.parent.Rotate(rotation); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值