1.创建工程与导入素材
2.素材图片的参数设置
创建游戏初始地图
3.迷宫的物理化
给迷宫添加碰撞体
4.制作吃豆人上下左右状态下的动画
创建吃豆人的动画,并且把 它拖入迷宫中
5.动画状态机简介与吃豆人运动参数分析
6.完成吃豆人动画状态机的设置
通过DirX和DirY来对吃豆人的状态机进行转变
7.吃豆人的物理化以及移动方式的选择
在吃豆人上创建PacmanMove的脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PacmanMove : MonoBehaviour
{
//吃豆人的移动速度
public float speed = 0.35f;
//吃豆人下一次移动将要去的目的地
private Vector2 dest = Vector2.zero;
private void Start()
{
//保证吃豆人在游戏刚开始的时候不会动
dest = transform.position;
}
}
8.让吃豆人可以在迷宫中移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PacmanMove : MonoBehaviour
{
//吃豆人的移动速度
public float speed = 0.35f;
//吃豆人下一次移动将要去的目的地
private Vector2 dest = Vector2.zero;
private void Start()
{
//保证吃豆人在游戏刚开始的时候不会动
dest = transform.position;
}
private void FixedUpdate()
{
Vector2 temp = Vector2.MoveTowards(transform.position, dest, speed);
GetComponent<Rigidbody2D>().MovePosition(temp);
if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
{
dest = (Vector2)transform.position + Vector2.up;
}
if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
{
dest = (Vector2)transform.position + Vector2.down;
}
if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))
{
dest = (Vector2)transform.position + Vector2.left;
}
if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))
{
dest = (Vector2)transform.position + Vector2.right;
}
}
}
运行程序结果如下
9.完善吃豆人的移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PacmanMove : MonoBehaviour
{
//吃豆人的移动速度
public float speed = 0.35f;
//吃豆人下一次移动将要去的目的地
private Vector2 dest = Vector2.zero;
private Animator anim;
private void Awake()
{
anim = GetComponent<Animator>();
}
private void Start()
{
//保证吃豆人在游戏刚开始的时候不会动
dest = transform.position;
}
private void FixedUpdate()
{
//插值得到要移动到dest位置下一次要移动的坐标
Vector2 temp = Vector2.MoveTowards(transform.position, dest, speed);
//通过刚体来设置物体的位置
GetComponent<Rigidbody2D>().MovePosition(temp);
//必须先达到上一个dest的位置才可以发出新的目的地的设置指令
if ((Vector2)transform.position == dest)
{
if ((Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W)) && Valid(Vector2.up))
{
anim.SetFloat("DirX", 0);
anim.SetFloat("DirY", 1);
dest = (Vector2)transform.position + Vector2.up;
}
if ((Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S)) && Valid(Vector2.down))
{
anim.SetFloat("DirX", 0);
anim.SetFloat("DirY", -1);
dest = (Vector2)transform.position + Vector2.down;
}
if ((Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A)) && Valid(Vector2.left))
{
anim.SetFloat("DirX", -1);
anim.SetFloat("DirY", 0);
dest = (Vector2)transform.position + Vector2.left;
}
if ((Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D)) && Valid(Vector2.right))
{
anim.SetFloat("DirX", 1);
anim.SetFloat("DirY", 0);
dest = (Vector2)transform.position + Vector2.right;
}
}
}
private bool Valid(Vector2 dir)
{
Vector2 pos = transform.position;
RaycastHit2D hit = Physics2D.Linecast(pos + dir, pos);
return (hit.collider == GetComponent<Collider2D>());
}
}
运行程序结果如下