1.导入角色图片并切片
新建文件夹player-将角色图片拖动至该文件夹内-选中图片文件后点击检查器内sprite editor按钮打开编辑器-点击切片按钮-切片方式选择自动-点击应用。
2.创建行走动画
分别选中所有面向前方后方等四个方向切片拖动至层级对话框内,保存文件至player子文件夹walk中,命名为Walk_U等四个文件,完成后删除层级框内刚新建的四个动画对象文件及walk文件夹内四个动画器文件。
这里我的窗口布局改为了默认布局
3.创建静止动画
打开walk文件夹-复制并粘贴Walk_D.admin等四个文件-于unity项目对话框内一次将其重命名为Idle_U等。
双击Walk_D打开动画编辑器-选中第一张动画复制-点击Idle_D切换到Idle_D动画粘贴,将另外三个也做同样处理。
4.建立角色静止动画规则
选中层级内Player对象-拖动项目对话框内Walk_D文件至检查器对话框内添加组件处以创建player动画器。
双击player打开动画器-删除动画器内已存在的Walk_D-右击动画器窗口空白处选择创建状态-新混合树并重命名为Idle,添加两个float类型参数Input_x、Input_y,一个bool类型参数iswalking。
双击打开Idle,检查器内混合类型修改为2D Freeform Cartesian,添加四个运动域-将参数改为Input_x、Input_y-将空运动换为Idle_D、Idle_U等,参数如图。
对此我的理解为:
假设player所在位置设为原点,当player面向Pos点方向时调用前面的motion,例如player往上时,也就是往Y轴正方向,那么pos即为(0,+)可以为(0,1)(0,0.1)(0,2)等,需要调用的动画为Idle_U。
5.建立角色移动动画规则
复制粘贴一份Idle更名为walking,将motion改为对应的walking动画。
6.建立过度条件
右键动画器内Idle创建过渡-取消退出时间-添加条件iswalking-值设为true,同理建立iswalking到idle过渡,设置iswalking为false。
7.创建移动控制脚本
选中层级内player对象,点击添加组件,选择New script
打开新建的脚本文件,编辑代码。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BehaviourScript : MonoBehaviour
{
Rigidbody2D rbody; //定义变量
Animator anim;
// Start is called before the first frame update
void Start()
{
rbody = GetComponent<Rigidbody2D>(); //初始化
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
Vector2 vector = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); //定义向量,获取水平竖直方向值 使用GetAxisRaw可以兼容方向键游戏手柄等。
if (vector!=Vector2.zero) //判断是否在移动
{
anim.SetBool("iswalking", true);
anim.SetFloat("Input_x", vector.x);
anim.SetFloat("Input_y", vector.y);
}
else
anim.SetBool("iswalking", false);
rbody.MovePosition(rbody.position + vector * Time.deltaTime * 100); //移动player
}
}
注意:
当脚本文件报无法加载关联的脚本时有两种情况,判断方法新建脚本文件不修改文件名若仍然报错则为第二种:1.类名与文件名不一致,解决方案修改类名或文件名。2.环境问题,解决方案删除项目窗口内SuperTiled2Unity文件夹并重新安装,若仍未解决则重装unity。
8.绑定摄像机
新建c#脚本文件,绑定到Main Camera,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraAuto : MonoBehaviour
{
public Transform targer; //定义变量
public float m_moveSpeed = 0.03f;
Camera mycamera;
// Start is called before the first frame update
void Start()
{
mycamera = GetComponent<Camera>(); //初始化
}
// Update is called once per frame
void Update()
{
//mycamera.orthographicSize = (Screen.height / 0.6f) / 4f; //设置摄像机范围
if(targer)
{
transform.position = Vector3.Lerp(transform.position, targer.position, m_moveSpeed); //移动摄像机
}
}
}
保存后选中Main Camera,将Player拖动到Targer即可。
注意:
脚本文件中的public变量会显示在unity脚本组件下拉菜单中,如上图中的targer、movespeed。