02-工程创建,素材导入与介绍
双击打开Unity,新建2D工程
调整布局:layout设置为2 by 3
导入素材
project面板调整为 One Column Layout
03-场景搭建,素材的处理
设置主摄像机:size(离屏幕位置)设置为8.5
Background设置为黑色
游戏显示窗口设置为 5:4
调出控制台窗口:ctrl+shif+c
图集的加工:导入素材的Texture调整为Sprite(2D and UI),点击apply
Sprite Mode:Multiple
切割图集(需要切割):点击Sprite Editor——Slice——Automayic ——点击Slice(调整大小,获得尺寸)——Grid By Size(按照固定大小切割)——点击Slice——点击X,点击apply
ctrl+s 保存场景
04-游戏中预制体的制作,2D动画的制作
Play1拖入Hierarchy面板下
unity开发以米为单位
Scale调整为3 3
改名为Player
在Projiect面板下,新建文件夹Prefabs存放预制体,拖入Player
再把map下的拖入Hierachy面板下,解决每个图片都要调整大小问题:
Sprite Render组件下的Sprite控制显示的图片,ctrl+D复制几个一样的物体,再拖入图片到Sprite下。
创建存放动画和存放动画控制器的文件夹Animation和AnimatorController
Born动画:鼠标单击选择第一张图片按住shift选择最后一张图片,拖入Hierarchy面板下,弹出窗口命名动画名字,命名为Born,Hierarchy面板下改名为Born。大小调整为3 3 3
控制器改名为BornController,与动画分别拖入相应文件夹下。
在预制体Prefabs文件夹下创建Map文件夹存放地图和Effect特效文件夹
同理,创建爆炸特效Explosion和无敌效果Shield,河流River
取消显示摄像机Gizmos,叉掉Camera旁边的摄像机
05-控制玩家的移动
创建新的文件夹Script,存放所有的脚本。
选择Player,点击Add Component
定义速度
public float moveSpeed=3;
控制游戏物体移动,在Update函数中
float h = Input.GetAxisRaw("Horizontal");//h=-1 左 h=1右
transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);
float v = Input.GetAxisRaw("Vertical");
transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);
06-控制图片的移动切换
方法一:切换图片的渲染和显示。
方法二:控制Z轴的旋转
方法一:拿到Sprite组件,更改他的属性值
拿到渲染器的引用:
private SpriteRenderer sr;
在Awake函数中(一开始就拿到),Start函数之前
private void Awake()
{
sr = GetComponent<SpriteRenderer>();
}
拿到切换图片的引用:
public Sprite[] tankSprite;//上 右 下 左
图片为:0 8 16 24
把图片拖入数组下面
上右下左
07-碰撞器的添加,解决抖动问题
发生碰撞的物体身上都应该有碰撞器,其中一方(最好是运动的一方)身上要有刚体。
给player游戏物体添加Box Collider 2D(2D游戏碰撞器)和刚体Rigibody 2D
新建文件夹Tank用来装所有的坦克
River调整到Map里
Map里所有的物体添加Box Collider 2D(2D游戏碰撞器)
Player的重力为0
删除草的碰撞器
解决旋转问题:选择Player游戏物体,在Rigibody 2D下的Constraints勾选上z轴
解决抖动问题:
unity内置的生命周期函数:
固定物理帧
private void FixedUpdate()
{
}
08-移动优先级的添加,2D渲染层级问题
解决同时按两个键,斜着走的问题。垂直优先。
先确定v
if (v != 0)
{
return;
}
把控制移动的代码封装成一个方法
在 FixedUpdate()中调用Move方法
渲染的优先级:Order in Layer层级越大,越后渲染。Born、Grass设置为1
添加子弹,层级设置为1,拖入Tank文件夹下做成预制体。爆炸特效层级也设置为1
09-坦克的攻击方法
拿到子弹的引用
public GameObject bullectPrefab;
当按下空格的时候实例化一个子弹
private void Attack()
{
if (Input.GetKeyDown(KeyCode.Space))//按下空格键
{
Instantiate(bullectPrefab, transform.position, transform.rotation);}}
10-子弹的朝向问题
private Vector3 bullectEulerAngles;
//子弹产生的角度:当前坦克的角度+子弹应该旋转的角度。
Instantiate(bullectPrefab, transform.position, Quaternion.Euler(transform.eulerAngles + bullectEulerAngles));
14-子弹朝向问题的解决,移动方法的编写
旋转图片——旋转Z轴
bullectEulerAngles = new Vector3(0, 0, -180);
12-攻击CD的加入,触发器与碰撞器的区别
创建子弹的脚本Bullet
在Update里面设置子弹移动
transform.Translate(transform.up * moveSpeed * Time.deltaTime, Space.World);
设置子弹CD
设置计时器:private float timeVal;
Update函数里调用攻击方法:
实例化之后归零timeVal = 0;//计时器归零
触发器:给子弹添加触发器:
给子弹添加Rigidbody2D,重力设置为0。