实现背景的设计与角色的移动
在下载好Unity Hub与Unity Editor的基础上(手机要下好Unity Connect),创建新项目,选中2D标准。
一、实现背景的设计
1.进入项目后,新建一个Tilemap和Background。
2D Object--->Tilemap--->Rectangular
2.将Tilemap副本重命名为background
3.导入资源
进入Unity Hub中的社区,点击素材下面的查看更多,即可进入官网,进入后需要注册用户(在Unity Connect里面注册,然后电脑网页上登录直接扫码)
进入官网搜索pixel,价格选free,然后搜索pixel Adventure 1
点击Add To My Assets
选择Accept
上面会出现这个弹框,选择Open in Unity
序号1处需要先登录之前注册好的账号,序号2处在显示PackageManage后看到Download后点击
下载成功后,会显示以下内容,点击import,就能导入资源
4.创建背景
背景需要绘制,那么就需要画画的工具,在window中选择2D--->Tile Palette
在画板里面选create New Palette
点击选择文件夹,就可以在该文件里面放置“颜料”
在下面的素材栏中寻找Assets--->Terrian--->Terrian Sliced(原本里面有两个包,其中右边那个包里面很多图片的)
点击它然后右边框出现属性,对Pixel Per Unit进行编辑
(不用点击Apply,之后点任意地方,它会显示是否保存)保存属性后
将Terrian Sliced拖入到Palette
如何选中:长按左键,拖拽
如何绘制到Terrian图层:(如下图就可以绘制)
如何清除:
了解这两个,就可以进行绘制(为了绘制更漂亮,选中间的)
最后效果
绘制结束,在Tilemap控件加入几个组件
Tilemap的图层要与Background分开
二、实现角色的移动
添加角色控件
第一步:在Assets中寻找角色动画(图片)
第二步将idle拖入Player属性栏中的Sprite中
(可以在Game视图中看到角色,但是它还不会动)
创建folder(文件夹)
在Main Characters中的Ninja Frog有四个动作Animator(分别是Idle-默认动作,running-跑,jumping-跳,falling-下坠)
在这里面创建Animation
将idle托到Player
会出现
然后再点击idle,点击Player则可以添加图片;
添加结束后,点击Game视图,然后点击上图”>“开始按钮,角色就能运动了
再多次创建Animator(每个Animator都需要拖拽到Player一次)
结果是这样就是对的
注意记得所有的Animator都需要LoopTime勾选
动作是搞定了但是之间的逻辑也得整理好。
逻辑就是:我有四个状态,默认为idle其数值为0,running数值为1,jumping数值为2,falling数值为3.我任意时间只能处于一个状态于是Animator中的关系图:
然后创建状态变量(int类型)state(名称)
点击箭头,
所有的Has Exit Time设置如下
同理,所有指向的状态,有对应它们的数值。
完成后逻辑关系解决,要写代码实现功能判断(对逻辑关系的判断)
现在Scripts中创建PlayerMovement脚本
双击进入Visual Studio
public class PlayerMovement : MonoBehaviour
{
/*声明变量的属性*/
private Rigidbody2D rb;
private BoxCollider2D coll;
private SpriteRenderer sprite;
private Animator anim;
//声明X轴位置为浮点型
private float dirX = 0f;
/*声明MoveSpeed,JumpFore初始变量值为5f,SerialField会在GameObject属性栏出现,即可以修改变量值*/
[SerializeField] private float MoveSpeed = 5f;
[SerializeField] private float JumpFore = 5f;
/*声明变量JumpableGround,其功能是为了限定跳跃范围*/
[SerializeField] private LayerMask JumpableGround;
//Movementstate枚举的作用是为了给这些状态排序并在Animator中更好使用这些状态
private enum Movementstate { idle,running,jumping,falling};
private void Start()
{
/*创建对象,获取组件功能*/
rb = GetComponent<Rigidbody2D>();
coll = GetComponent<BoxCollider2D>();
sprite = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
}
private void Update()
{
transform.rotation=Quaternion.Euler(0,0,0);
dirX = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector2(dirX*MoveSpeed,rb.velocity.y);
if (Input.GetButtonDown("Jump") && IsGrounded())
{
rb.velocity = new Vector2(rb.velocity.x, JumpFore);
}
UpdateMovementState();
}
private void UpdateMovementState()
{
Movementstate state;
if (dirX > 0f)
{
state = Movementstate.running;
//sprite.flipX表示图片的方向
sprite.flipX = false;
}
else if (dirX < 0f)
{
state = Movementstate.running;
sprite.flipX = true;
}
else
{
state = Movementstate.idle;
}
//判断是上升还是下降
if (rb.velocity.y > .1f)
{
state = Movementstate.jumping;
}
else if (rb.velocity.y < -.1f)
{
state = Movementstate.falling;
}
//在Animator中可以构建state变量,以便连接visiual中的state和animator中的state
anim.SetInteger("state",(int)state);
}
private bool IsGrounded()
{
return Physics2D.BoxCast(coll.bounds.center,coll.bounds.size, 0f, Vector2.down, .1f, JumpableGround);
}
}
再创建Camera脚本
public class Camera : MonoBehaviour
{
[SerializeField] private Transform player;
void Update()
{
transform.position = new Vector3(player.position.x, player.position.y,transform.position.z);
}
}
最后将PlayerMovement移到Player属性栏中
脚本中的JumpableGround中的Ground(这个Ground原本没有,需要自己创建)
与Tilemap中的Ground一致
、
先在Composite Colldier2D里设置Used By Effector
再不勾选Use On Way
最后处理一下player中的组件
将player控件拖入到Animator中,如果已存在如上图一致,那就不需要改变。
(还忘了一个东西,那就是Camera控件)
我们需要把Camera控件属性栏打开然后把Camera脚本拖到属性栏里面去
最后把player控件拖到脚本的player属性里面去。
运行一下,角色就能根据你的左右键移动(jump是空格)