吃豆人2d
脚本格式:脚本选中内容——Ctrl+k——Ctrl+f
准备
3d工程 改为2d工程:file——project setting——editor——default behavior mode
基础设置:file——build setting——player setting——公司名称、图标、分辨率
取消全屏、512*512、取消Dialog
导入资源 文件夹、包
- audio音频
- font(像素风字体)
- sprites图片
- Animation
- Scripts
素材图片大小
-
物体大小scale
-
摄像机大小size——16
-
素材文件 每单位像素点pixel per unit——改为8 、apply
坐标原点
迷宫左下角为原点:图片文件maze——pivot设置为bottom left
迷宫
墙壁:碰撞器box collider2d
宽度size为0.25的整数倍
方法:
-
空物体父级下,放多个挂碰撞器的物体(每个墙体分开)
-
迷宫物体上,挂多个碰撞器组件box collider2d
-
编辑器扩张,读取Excel的值,代码生成多个碰撞器组件
-
自动识别墙体。。
吃豆人动画
图片文件:
模式multiple
sprite editor
切割图片slice
按照格子切割cell count
自动切割会监测图片边缘
动画
选择多张图片,拖到面板
创建动画clip
新建文件夹Animations存放动画
windows——Animation查看
- 上
- 下
- 左
- 右
动画状态控制机windows——animator
添加clip
进入后默认向右移动
参数float- DirX,float- DirY
添加condition——单个条件,float类型 0.1
取消可以转换到自己
动画不融合transition duration为0
speed为0.8
像素游戏——不斜着移动
- 从任何状态 转到上下左右移动动画
- 进入
- 退出
吃豆人移动
添加圆形碰撞器circle collider 2d——设置半径
添加刚体rigidbody2d——gravity设为0
创建脚本文件夹Scripts——创建脚本
移动方式:
- 瞬移
- 插值移动
- Vector2.MoveTowards()保证速度不超
- Vector2.Lerp()
移动方法:
- 改变Transform
- 物理移动 有刚体组件的物体rigidbody2d
Update调用:取决于fps帧率
FixedUpdate:物理帧
》PacmanMove
(有问题?碰到豆点动不了??)
public float speed=0.35f;//速度
private Vector2 dest=Vector2.zero;//移动的目的地
void Start()
{
dest=this.transform.position;//游戏初始 留在原地 不动 (this可以省略)
}
void FixedUpdate()
{
Vector2 temp=Vector2.MoveTowards(transform.position,dest,speed);//插值得到 要移动到dest位置的下一次移动坐标(当前位置,目标位置,速度)
GetComponent<Rigidbody2D>().MovePosition(temp);//用刚体rigidbody2d设置位置
if((Vector2)transform.position==dest)//必须先到达上一个dest的位置,才可以发出新的目的地设置指令
{
//键盘输入(箭头或者wasd) 检测目的地是否可以到达
if((Input.GetKey(KeyCode.UpArrow)||Input.GetKey(KeyCode.W)) &&Valid(Vector2.up))
{
dest=(Vector2)transform.position+Vector2.up;//强行转换类型
}
if((Input.GetKey(KeyCode.DownArrow)||Input.GetKey(KeyCode.S)) &&Valid(Vector2.down))
{
dest=(Vector2)transform.position+Vector2.down;
}
if((Input.GetKey(KeyCode.LeftArrow)||Input.GetKey(KeyCode.A)) &&Valid(Vector2.left))
{
dest=(Vector2)transform.position+Vector2.left;
}
if((Input.GetKey(KeyCode.RightArrow)||Input.GetKey(KeyCode.D)) &&Valid(Vector2.right))
{
dest=(Vector2)transform.position+Vector2.right;
}
//动画状态机
Vector2 dir=dest-(Vector2)transform.position;//移动方向
GetComponent<Animator>().SetFloat("DirX",dir.x);//与animator中设置的参数相同
GetComponent<Animator>().SetFloat("DirY",dir.y);
}
}
private bool Valid(Vector2 dir)//检测目的地是否可到达 (位置增量