unity3d:动画animator,AvatarMask,边走边攻击,单独设置run动画速度

分为3layer,run-idel层(layer0),攻击时上半身层(layer1),原地攻击层(layer2),其中layer1,layer2里面完全复制的动画状态机

其中layer1设置mask,屏蔽下半身动作

在移动时切换layer1,layer2的权重,同时只存在一个为0,一个为1

代码语言:javascript代码运行次数:0运行复制using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.AI;

public class PlayerCtrl : MonoBehaviour {

public NavMeshAgent m_agent;

public Animator m_ani;

Vector3 m_newPos;

float m_stopDis = 0.02f;

public static int IsRunning = Animator.StringToHash("IsRunning");

public static int AttackID = Animator.StringToHash("AttackID");

bool m_isRunning = false;

public Transform m_model;

public float m_rotateSpeed = 180f;

// Use this for initialization

void Start () {

m_newPos = transform.position;

m_ani.SetLayerWeight(1, 0);

m_ani.SetLayerWeight(2, 1);

}

// Update is called once per frame

void Update () {

//鼠标左键

if (Input.GetMouseButtonDown(0))

{

//射线检测

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

RaycastHit hit;

bool isCollider = Physics.Raycast(ray, out hit);

if (isCollider)

{

m_agent.SetDestination(hit.point);

m_newPos = hit.point;

}

}

if (m_agent.hasPath)

{

if (m_isRunning == false)

{

m_isRunning = true;

m_ani.SetBool(IsRunning, true);

m_ani.SetLayerWeight(1, 1);

m_ani.SetLayerWeight(2, 0);

}

}

else {

if (m_isRunning == true)

{

m_isRunning = false;

m_ani.SetBool(IsRunning, false);

m_ani.SetLayerWeight(1, 0);

m_ani.SetLayerWeight(2, 1);

}

}

if (Input.GetKeyDown(KeyCode.Q))

{

m_ani.SetInteger(AttackID, 1);

}

}

}原地攻击动作

边走边攻击动作

单独设置run动画速度