Unity-动作系统-案例学习(1)⼈物移动和转向系列⽂章⽬录
(更新中。。。)
⽬录
前⾔
本⼈对游戏的动作系统⽐较感兴趣,同时打算尽可能系统的学习Unity3d的动作系统,再次记录基于unity案例的学习历程。实现效果(⽰例):
提⽰:以下是本篇⽂章正⽂内容,下⾯案例可供参考
⼀、⼈物的站⽴状态
不同状态的参数切换:
在defaultIdle中添加StateMachineBehaviour的派⽣类;
在脚本中实现⼀定时间后更改整数参数的函数(接⼝)(创建脚本时会⾃动⽣成接⼝的模板)
protected float ChangeTime;
protected bool idleState = fal;
protected float idleTime = 0f;
protected readonly int hashOfRandomIdle = Animator.StringToHash("RandomIdle");
protected readonly int hashOfDefaultIdleState = Animator.StringToHash("DefaultIdleState");//默认idle标签
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
挚爱的英文
ChangeTime = Random.Range(5f,8f);
googo>zmridleState = true;
animator.SetInteger(hashOfRandomIdle,0);
}
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
idleState = fal;
}dees
// OnStateMove is called right after Animator.OnAnimatorMove()
override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{fsk
idleTime += Time.deltaTime;
if(animator.GetCurrentAnimatorStateInfo(0).tagHash == hashOfDefaultIdleState && idleTime >= ChangeTime)
{
idleTime = 0f;
int index = Random.Range(1, 4);
//Debug.Log("idle:" + index);
animator.SetInteger(hashOfRandomIdle, index);//随机赋值 1 到 3
}
}
OnstateEnter:进⼊该状态时⾃动调⽤,idleTime = 0,idle状态参数设置为0;
OnstateMove: 在Animator.OnAnimatorMove()后调⽤,对idleTime计时,达到⼀定时间随机切换idle状态;
默认状态,
随机状态:
⼆、⼈物的移动实现
质量管理体系标准实现⼈物的向前移动,⾸先实现的只是向朝向移动,不涉及转向。
1. 添加必要组件
为⼈物添加animator、character Controller组件,新建⼀个MyPlayerInput、MyPlayerController脚本。 设置⼈物为Player层级
2. Animator状态结构体设置
Motion混合树:
这⾥只⽤1D就⾏了。在脚本中不断更新forwardSpeed的速度,从⽽控制⼈物的前进速度和前进状态(idle、walk、run)。
3. MyPlayerInput脚本实现:
public class MyPlayerInput : MonoBehaviour
{
public static MyPlayerInput m_Input
{
get
{
return m_Instance;
}
}
施工许可证管理办法
protected static MyPlayerInput m_Instance;
yangquanprotected Vector2 m_MoveInput;
protected Vector2 m_CameraInput;
protected bool m_Jump;差距英语
protected bool m_attack;
[HideInInspector]
public bool playerInputBlock;
public bool Attack
{
get
{
return m_attack && !playerInputBlock;//还要不处于其他状态
}
}
public Vector2 MoveInput
{
get
{
return m_MoveInput;
}
}
public Vector2 CameraInput
{
get
{
return m_CameraInput;
}
}
public bool Jump
{
get
{
return m_Jump;
阴极射线
}