Unity 角色控制器重复使用Ragdoll布娃娃系统,动画控制和布娃娃状态切换

大家好,今天开发游戏的时候做了Ragdoll相关的功能,于是写写心得。

如果要在单一物体重复使用Ragdoll布娃娃系统,那我们需要对物体设置两个状态,一个是正常状态,受动画系统控制,一个是布娃娃状态,受布娃娃节点控制。(Unity开发环境2018.4 LTS)

预览效果:

分为几个部分:

首先是初始化,我们要遍历角色身体上的所有ragdoll并存储。

    public List<Rigidbody> RagdollRigidbodys = new List<Rigidbody>();
    public List<Collider> RagdollColliders = new List<Collider>();

    void InitRagdoll()
    {
        Rigidbody[] Rigidbodys = GetComponentsInChildren<Rigidbody>();
        for (int i = 0; i < Rigidbodys.Length; i++)
        {
            if (Rigidbodys[i] == GetComponent<Rigidbody>())
            {
                //排除正常状态的Rigidbody
                continue;
            }
            //添加Rigidbody和Collider到List
            RagdollRigidbodys.Add(Rigidbodys[i]);
            Rigidbodys[i].isKinematic = true;
            Collider RagdollCollider = Rigidbodys[i].gameObject.GetComponent<Collider>();
            RagdollCollider.isTrigger = true;
            RagdollColliders.Add(RagdollCollider);
        }
    }

当角色死亡或击倒时,执行启用布娃娃系统

    void EnableRagdoll()
    {
        //开启布娃娃状态的所有Rigidbody和Collider
        for (int i = 0; i < RagdollRigidbodys.Count; i++)
        {
            RagdollRigidbodys[i].isKinematic = false;
            RagdollColliders[i].isTrigger = false;
        }
        //关闭正常状态的Collider
        GetComponent<Collider>().enabled = false;
        //下一帧关闭正常状态的动画系统
        StartCoroutine(SetAnimatorEnable(false));
    }

当角色复活或站起来时,关闭布娃娃系统

    void DisableRagdoll()
    {
        //关闭布娃娃状态的所有Rigidbody和Collider
        for (int i = 0; i < RagdollRigidbodys.Count; i++)
        {
            RagdollRigidbodys[i].isKinematic = true;
            RagdollColliders[i].isTrigger = true;
        }
        //开启正常状态的Collider
        GetComponent<Collider>().enabled = true;
        //下一帧开启正常状态的动画系统
        StartCoroutine(SetAnimatorEnable(true));
    }

延迟一帧执行开关动画状态

    IEnumerator SetAnimatorEnable(bool Enable)
    {
        yield return new WaitForEndOfFrame();
        Anim.enabled = Enable;
    }

注:Anim是Animator

By 杨天睿TeraYang

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一种可能的Unity代码,用于控制角色移动时的动画状态切换: ```c# using UnityEngine; public class CharacterController : MonoBehaviour { private Animator animator; private Rigidbody2D rb; private bool isMoving; private float moveSpeed; private float horizontalInput; private void Start() { animator = GetComponent<Animator>(); rb = GetComponent<Rigidbody2D>(); } private void Update() { // 获取水平输入 horizontalInput = Input.GetAxis("Horizontal"); // 根据移动速度,判断角色是否移动中 isMoving = Mathf.Abs(horizontalInput) > 0; // 更新动画参数 animator.SetBool("isMoving", isMoving); // 根据水平输入调整角色朝向 if (horizontalInput > 0) { transform.localScale = new Vector3(1, 1, 1); } else if (horizontalInput < 0) { transform.localScale = new Vector3(-1, 1, 1); } } private void FixedUpdate() { // 设置角色的水平移动速度 moveSpeed = 5f; // 可根据需要调整速度 rb.velocity = new Vector2(horizontalInput * moveSpeed, rb.velocity.y); } } ``` 在这个示例代码中,`CharacterController` 脚本绑定在角色游戏对象上,用于控制角色的移动和动画状态切换。在 `Start` 方法中,我们获取了角色的 `Animator` 组件和 `Rigidbody2D` 组件。 在 `Update` 方法中,我们首先通过 `Input.GetAxis` 获取水平输入,然后通过判断水平输入的绝对值判断角色是否在移动中,并将这个状态值更新到动画参数 `isMoving` 中。接着,我们根据水平输入的正负调整角色的朝向,从而实现角色的左右移动。 在 `FixedUpdate` 方法中,我们根据水平输入设置角色的水平移动速度,并通过给 `Rigidbody2D` 组件的 `velocity` 属性赋值来实现角色的物理移动。 通过这样的实现,我们可以在角色移动时动态切换不同的动画状态,从而呈现出流畅的角色移动效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值