2D 动画调整 position 产生的位移问题

本文介绍了解决Unity中动画物体使用世界坐标导致的问题的方法。通过将角色物体挂载到父GameObject下,使其使用相对坐标,从而使得所有位移都相对于父GameObject。此外,还介绍了Animator组件的挂载位置选择。

原因是制作动画的物体挂在 root 位置下,则 position 使用的是世界坐标

解决方法很简单,使物体的位移动画使用相对坐标,比如:

一个 Character 物体需要制作位移动画,则应该将 Character 挂载到一个父 GameObject 下再进行制作,这样 Character 物体使用相对坐标,所有的位移都是相对于父 GameObject

Animatoer 组件挂载到 Character 上还是父 GameObject 上都是可以的,根据情况使用

一般挂在 父 GameObject 上, 后续操作更方便, 这时注意给子物体制作动画时要用 "Add Property" 添加 "Sprite Renderer" 的方式


### 实现Unity2D角色在斜坡上的移动和行走动画 为了实现在Unity2D中角色能够在斜坡上正常移动并配合相应的行走动画,可以通过以下方式完成。这涉及到了`Rigidbody2D`、碰撞检测以及动画状态机的设置。 #### 1. **基础组件初始化** 确保脚本中有必要的组件引用: ```csharp public class PlayerController : MonoBehaviour { public Rigidbody2D rb; public CircleCollider2D circleCollider; public Animator animator; public LayerMask groundLayer; // 地面图层 public float moveSpeed = 5f; // 移动速度 public float jumpForce = 700f; // 跳跃力 private bool isGrounded; // 是否接触地面 } ``` 在此部分中定义了刚体 (`Rigidbody2D`) 和圆形碰撞器 (`CircleCollider2D`) 的引用[^1],这些用于处理物理交互;还设置了动画控制器 (`Animator`) 来管理不同状态下的动画切换。 --- #### 2. **检测是否站在地面上** 通过射线检测来判断角色是否处于地面之上,这是实现跳跃逻辑的关键之一。 ```csharp private void CheckIfGrounded() { Vector2 position = (Vector2)transform.position + new Vector2(0, -circleCollider.radius); RaycastHit2D hit = Physics2D.CircleCast(position, circleCollider.radius * 0.98f, Vector2.down, 0.02f, groundLayer); if (hit.collider != null && !isOnSlope(hit)) { isGrounded = true; } else { isGrounded = false; } animator.SetBool("IsGrounded", isGrounded); // 更新动画参数 } // 判断当前是否位于斜坡上 private bool isOnSlope(RaycastHit2D hit) { return Mathf.Abs(Vector2.Angle(hit.normal, Vector2.up)) < 30f; // 斜率角度阈值调整为30度 } ``` 这里引入了一个辅助函数 `isOnSlope()`,用来判定角色是否正处在某个特定倾斜程度的表面上[^2]。如果发现表面法向量偏离垂直方向超过一定范围,则认为该位置属于斜坡区域。 --- #### 3. **水平移动与重力修正** 为了让角色顺利沿斜面向下滑动或者保持静止不动,需动态调整其受力情况。 ```csharp private void HandleMovement(float horizontalInput) { if (!isGrounded || isOnSlope(lastRaycastHit)) { rb.velocity = new Vector2(horizontalInput * moveSpeed, rb.velocity.y); } else { rb.AddForce(new Vector2(horizontalInput * moveSpeed, 0)); } UpdateAnimationState(horizontalInput); // 同步更新动画状态 } private void ApplyGravityCorrection() { if (lastRaycastHit.collider != null && isOnSlope(lastRaycastHit)) { rb.velocity += GetSlopeMoveDirection(lastRaycastHit).normalized * Physics2D.gravity.magnitude * Time.fixedDeltaTime; } } private Vector2 GetSlopeMoveDirection(RaycastHit2D hit) { return Vector2.Perpendicular(hit.normal).normalized; } ``` 此代码片段实现了基于输入的方向控制角色左右平移的同时考虑到了可能存在的额外加速度影响因素——即来自下方地形的影响所致的变化趋势[^3]。 --- #### 4. **跳跃机制扩展** 允许玩家即使身处斜坡顶端也能执行正常的起跳动作。 ```csharp private void TryJump() { if (Input.GetKeyDown(KeyCode.Space) && isGrounded) { rb.AddForce(Vector2.up * jumpForce); animator.SetTrigger("Jump"); // 设置触发器改变动画 } } ``` 只要满足按键条件且确认脚下有支撑物即可激活向上施加冲量的操作。 --- #### 5. **动画状态同步** 最后一步就是让整个过程反映到视觉表现层面去。 ```csharp private void UpdateAnimationState(float horizontalInput) { if (Mathf.Abs(rb.velocity.x) > 0.1f) { animator.SetFloat("Speed", Mathf.Abs(rb.velocity.x)); // 动画播放速率依据实际位移大小决定 } else { animator.SetFloat("Speed", 0); } animator.SetBool("IsWalking", Mathf.Abs(horizontalInput) > 0); // 控制走路/停止两种模式间的转换 } ``` 以上方法会持续监控键盘指令并将对应数值传递给关联的对象属性以便驱动预设好的图形序列展示出来[^1]。 --- ### 总结说明 综上所述,我们已经构建出了一个较为完整的框架结构用以支持Unity引擎环境下二维空间内的实体对象按照预期轨迹行动并且伴随恰当的表现形式变化。它综合运用了多种技术手段如物理模拟计算、事件监听响应以及美术资源调度等方面的知识点共同作用才得以达成最终效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值