我们在assets里创建一个Animator Charactercontrol,命名为Character,这就是我们Hero的组件Animator需要添加的controller。

首先我们在Base Layer创建五个State(Idle,Run,Jump,Death,Falling),然后把我们前面创建好的animation Clip赋予到Motion参数,然后再左下角添加4个参数,分别是float类型的speed,Trigger类型的Jump,Shoot,Die。

在Idle=Run状态我们通过speed连接起来(在inspector视图的conditions选项上选择speed,从idle到Run为greater,反之则为less)

Run=Jump状态我们通过Jump连接起来(从Run到Jump我们只要选condition为Jump,而从Jump到Run我们则要选择condition为speed,greater大于0.1。还有exit time为0.58)。

Idle=Jump状态通过Jump连接。

Death和Falling状态我们在any State中连接起来。

详情如下图:

下面我们来做Shooting的状态设置,这里我们在右上角出增加一个层shooting层。为什么要这样设置呢,因为我们需要hero可以一边移动同时一边射击,而如果我们把shooting状态放到Base Layer层的话,hero会先停止当前的状态动画才去进行射击动画。这显然不是我们想要的效果,我们需要hero能够一个移动的同时一边可以进行射击,两者互不影响。在这里增加一个shooting就起到了这个作用,我们把weight(权重)设为1,Blending选项为Override。这样hero就可以达到我们想要的效果。)(从Any State到shoot状态的触发器设置condition为shoot)如下图。

关于状态机这部分如果大家看上面的图不清晰,可以看原来的项目。

下面我们进入到脚本控制部分,开始进行hero的脚本编写。创建一个脚本PlayerControl,挂在Hero上。下面是移动的代码:

using UnityEngine;

using System.Collections;

public class PlayerControl : MonoBehaviour

{

[HideInInspector]

public bool facingRight = true;

[HideInInspector]

public bool jump = false;

public float moveForce = 365f;

public float maxSpeed = 5f;

void Awake()

{

anim = GetComponent<Animator>();

}

void FixedUpdate ()

{

// Cache the horizontal input.

float h = Input.GetAxis("Horizontal");

//水平方向设置animator参数一个Horizontal的绝对值

// The Speed animator parameter is set to the absolute value of the horizontal input.

anim.SetFloat("Speed", Mathf.Abs(h));

// If the player is changing direction (h has a different sign to velocity.x) or hasn't reached maxSpeed yet...

if(h * rigidbody2D.velocity.x < maxSpeed)

// ... add a force to the player.方向不变,没有到达最大速度时赋予player力

rigidbody2D.AddForce(Vector2.right * h * moveForce);

// If the player's horizontal velocity is greater than the maxSpeed...

if(Mathf.Abs(rigidbody2D.velocity.x) > maxSpeed)

// ... set the player's velocity to the maxSpeed in the x axis.当到达最大速度,重新赋予速度

rigidbody2D.velocity = new Vector2(Mathf.Sign(rigidbody2D.velocity.x) * maxSpeed, rigidbody2D.velocity.y);

// If the input is moving the player right and the player is facing left...//如果player向右移而方向没有向右,转向

if(h > 0 && !facingRight)

// ... flip the player.

Flip();

// Otherwise if the input is moving the player left and the player is facing right...

else if(h < 0 && facingRight)

// ... flip the player.

Flip();

}

}

void Flip ()

{

// Switch the way the player is labelled as facing.

facingRight = !facingRight;

// Multiply the player's x local scale by -1.

Vector3 theScale = transform.localScale;

theScale.x *= -1;

transform.localScale = theScale;

}

代码挺简单的,我们通过给我们的Hero调用AddForce方法,赋予Hero一个方向上的力使其移动,同时播放移动的动画。