1. 人物的导入与相关设定
1.1 基础设定
当我们获得游戏素材之后,记得检查上述红圈所标注的设定,这将影响成像的效果。
文章所示素材为像素人物,所上述将Pixels Per Unit设定为25,Filter Mode设定为Point。设定之后需要点击Apply进行应用。
1.2 物理效果
为了实现人物的效果,我们需要用到Unity中自带物理引擎模块,例如碰撞体与刚体;
顾名思义,碰撞体(Collider 2D)是想要让人物与其他物体间进行接触碰撞(物体也需要设定为碰撞体),刚体(Rigidbody 2D)则是让人物获得物理属性,例如重力。
如下图所示,将两个组件进行设定:
1.3 渲染器
渲染器顾名思义就是将我们角色或物体的形状,颜色等进行修改。为了方便后续动画的设定,我们将Player类设定一个子类Animator,将渲染器以及动画控制器都设定在其中。
2. 人物动作的执行
对于一系列人物的设定就需要使用到我们的脚本,Unity使用C#语言。
笔者对于C#语言也有一系列博客,感兴趣的读者可以进入我的主页专栏C#语言入门阅读。
2.1 前进
2.1.1 代码实现前进
通过GetaxisRaw方法在水平方向上获取整型值-1,1
调用我们的对象刚体,设定其在x,y轴上的速度就可以实现对象的移动。
但从测试结果看,我们的对象在移动过程中是不断旋转的,这是因为物体所配置的物理组件的影响,我们需要在刚体(Rigidbody)中对参数进一步进行设定:
2.1.2 动画导入与设定
在设定中,我们需要选中window中Animation选项将我们的窗口进行选中
游戏中的物体需要配置一个animator组件。可以理解为在物体上附加动画效果,动画的调用需要使用动画控制器,让附加在物体中的动画分条件进行调用。
将我们的图片效果导入我们即可得到我们的动画,相应的我们需要对所使用的动画进行参数设定以及条件设定:
相应的参数以及条件设定完毕后,我们的物体需要使用代码获取我们的动画对象以及相应的参数,能够进一步控制在什么条件下调用动画。
public class Player_Controller : MonoBehaviour
{
[Header("Object Inform")]
public Rigidbody2D rb;
public Animator anim;
[Header("Moving Infrom")]
[SerializeField] private float xInput;
[SerializeField] private float MoveSpeed;
private bool isMoving;
[Header("Flip Inform")]
[SerializeField] private int FacingDir = 1; //设定朝向,朝右则为1,左为-1
private bool FacingRight = true; //判断是否朝右
void Start()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponentInChildren<Animator>(); //获取子对象身上的动画器
}
void Update()
{
FlipController();
xInput = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector2(xInput * MoveSpeed, rb.velocity.y);
Animator_controllers();
}
private void Animator_controllers()
{
anim.SetBool("isMoving", isMoving); //获取动画器上的isMoving变量
isMoving = rb.velocity.x != 0; //当速度不为零的时候为True
}
2.2 翻转
翻转我们将设定两个方法,一个方法是使得物体进行翻转,另一个是控制物体在什么时候翻转
[Header("Flip Inform")]
[SerializeField] private int FacingDir = 1; //设定朝向,朝右则为1,左为-1
private bool FacingRight = true; //判断是否朝右
private void Flip()
{
FacingDir = FacingDir * -1; //反转之后参数设定
FacingRight = !FacingRight;
transform.Rotate(0,180, 0); //沿着y轴旋转180度
}
private void FlipController()
{
if (rb.velocity.x > 0 && !FacingRight) //如果物体速度向右且不朝向右,则翻转
{ Flip(); }
else if (rb.velocity.x < 0 && FacingRight)
{ Flip(); }
}
随后在update函数中调用翻转控制器即可。
2.3 跳跃
2.3.1 跳跃的设定
我们需要对跳跃进行设定,只有在满足某些条件的情况下才可以进行跳跃
这个时候最好的方式是设定地面碰撞器,只有角色在地面时才可以进行跳跃; 我们可以想象物体的重心向地面延伸一条射线,射线到里面的距离就是地面监测的距离,如果物体离地面的距离长于射线距离,则判定为不在地面,为了方便编写相应程序,我们将射线可视化出来。
private float groundCheckDistance;
private void OnDrawGizmos()
{
Gizmos.DrawLine(transform.position,new Vector3(transform.position.x,transform.position.y - groundCheckDistance));
}
变量groundCheckDistance就是我们物体重心离目标范围的检测距离。
private bool isGrounded;
[SerializeField] private LayerMask WhatisGround; //定义目标图层
void Update()
{
isGrounded = Physics2D.Raycast(transform.position,Vector2.down,groundCheckDistance,WhatisGround);
//参数输入可以理解为目标位置,检测方向,检测距离,目标图层
}
通过上述条件置入我们的Jump方法中即可。
2.4 冲刺
根据上述动画的创建,动画参数以及条件进行设定,我们将对于什么时候冲刺根据代码进行设定,以及设定相应的冲刺时间器。
代码中设定冲刺时间以及冲刺初始化参数,冲刺这个过程不仅要调用相应的冲刺动画,也要对物体本身的速度进行重新设定,所以在Movement方法中我们需要进一步设定。
最终在动画器的调用环节,将isDash参数与(Dashtime)参数是否大于0进行挂钩进行条件设定。
public class Player_Controller : MonoBehaviour
{
[Header("Object Inform")]
public Rigidbody2D rb;
public Animator anim;
[Header("Moving Infrom")]
[SerializeField] private float xInput;
[SerializeField] private float MoveSpeed;
private bool isMoving;
[Header("Dash Inform")]
private bool isDash;
private float DashDuration = .3f; //设定冲刺时间
private float DashTime; // 初始化冲刺时间
[Header("Flip Inform")]
[SerializeField] private int FacingDir = 1; //设定朝向,朝右则为1,左为-1
private bool FacingRight = true; //判断是否朝右
void Start()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponentInChildren<Animator>(); //获取子对象身上的动画器
}
void Update()
{
DashTime = DashTime - Time.deltaTime; // 随着时间进行流逝
if (Input.GetKeyDown(KeyCode.LeftShift)) //如果按下左shift建初始化冲刺
{ DashTime = DashDuration; }
FlipController();
xInput = Input.GetAxisRaw("Horizontal");
Movement();
Animator_controllers();
}
private void Movement()
{
if (DashTime > 0)
{
rb.velocity = new Vector2(FacingDir * 8, rb.velocity.y);
}
else
{
rb.velocity = new Vector2(xInput * MoveSpeed, rb.velocity.y);
}
}
private void Animator_controllers()
{
anim.SetBool("isDash",DashTime > 0); //大于0时,isDash为true
anim.SetBool("isMoving", isMoving); //获取动画器上的isMoving变量
isMoving = rb.velocity.x != 0; //当速度不为零的时候为True
}
private void Flip()
{
FacingDir = FacingDir * -1; //反转之后参数设定
FacingRight = !FacingRight;
transform.Rotate(0,180, 0); //沿着y轴旋转180度
}
private void FlipController()
{
if (rb.velocity.x > 0 && !FacingRight) //如果物体速度向右且不朝向右,则翻转
{ Flip(); }
else if (rb.velocity.x < 0 && FacingRight)
{ Flip(); }
}
}