Generic/Legacy ——ApplyRootMotion

文中使用代码出自:点击打开链接

增加动画切换控制


using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class ApplyRootMotion : MonoBehaviour
{
    //-- Root Motion 控制变量  
    public Transform m_rootBone;
    Vector3 m_lastRootPos;
    Vector3 m_rootMotion;
    int m_lastAnimTime;


    public Animator anim;
    public SkinnedMeshRenderer skinMesh;


    void Start()
    {
        anim = this.GetComponent<Animator>();


        //-- 从SkinnedMeshRenderer中读取Root Bone  
        //m_rootBone = skinMesh.rootBone;


        //-- 变量初始化  
        m_rootMotion = Vector3.zero;
        m_lastRootPos = m_rootBone.localPosition;
        m_lastAnimTime = 0;
    }


    void LateUpdate()
    {
        AnimatorStateInfo animState = anim.GetCurrentAnimatorStateInfo(0);


        if (animState.IsName("Take 001")|| animState.IsName("Take 001 1") || animState.IsName("Take 001 2") || animState.IsName("Take 001 3"))
        {
            if ((int)animState.normalizedTime > m_lastAnimTime)
            {
                //-- 动画循环处理  
                m_lastRootPos = m_rootBone.localPosition;
                m_rootMotion = Vector3.zero;
            }
            else
            {
                //-- 计算当前帧的Root Motion  
                Vector3 rootPos = m_rootBone.localPosition;
                m_rootMotion = rootPos - m_lastRootPos;
                m_lastRootPos = rootPos;
                rootPos.x = 0;
                rootPos.z = 0;
                m_rootMotion.y = 0;
                m_rootBone.localPosition = rootPos;
            }
            m_lastAnimTime = (int)animState.normalizedTime;
        }
        else
        {
            m_lastRootPos = m_rootBone.localPosition;
            m_rootMotion = Vector3.zero;
        }

    }


    void Update()
    {
        if (!isMove) return;
        //-- Apply Root Motion  
        Vector3 nextPos = this.transform.position + m_rootMotion;
        this.transform.position = nextPos;
    }

    public bool isMove = true;

    public void StartMove()
    {
        isMove = true;
    }

    public void StopMove()
    {
        isMove = false;
    }

}



//通过程序在播放动画的时候增加人物位移,但是这种方式会有滑步。

public class Move : MonoBehaviour {

    public Animator ani;
    public float speed = 2;
    public bool isMove = false;

    void Update()
    {
        //attack move
        if (ani != null && isMove)
        {
            AnimatorStateInfo info = ani.GetCurrentAnimatorStateInfo(0);
            if (info.IsName("Attack"))
            {
                Vector3 temp = this.transform.forward;
                temp = -this.transform.forward * Time.deltaTime * speed;
                this.transform.position += temp;
            }
        }
    }

}




补充:

1、带位移动作 输出都是从0点开始移动信息

2、攻击之后接IDLE还原蒙皮位置信息




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值