本文章为记录游戏开发学习过程中的笔记,仅供学习Unity开发游戏的童鞋参考作用。
第一课 项目简介(标签和层的设置)
1.新建2D项目命名为2D_Roguelike,导入资源,在标签(Tag)里已经添加了(Player、GameController、Food、Exit、Enemy、Soda),在Layer中添加了BlockingLayer。
2.其中_Completed文件夹是完整游戏文件夹。
3.后面会创建格子地图、动画、音效、UI、还有游戏的脚本。
4.最后一节,添加触屏控制功能。
(虽说游戏的可玩性并不高,但有很多基础的东西能够学习,然后再融入到自己的游戏里面去)
第二课 创建主角与敌人动画(序列帧动画)
1.新建场景,新建文件夹Animation、AnimationController、Scripts、Prefabs,创建空的物体命名为Player,在图集Sprite文件夹中多选前6张(序号0-5),拖到刚才创建的Player中命名为PlayerIdle(闲时动画),保存到Animations文件夹中,动画控制器保存到Animation Controller。
2.拖PlayerChop攻击动画(2张(序号40、41))到Player中,命名为PlayerChop,保存到Animations,同样步骤添加PlayerHit受伤动画(序号46、47)。
3.打开Player的动画控制器,控制器中按住alt键使用鼠标可以拖拽查看,调整速度Speed为0.5,设置Player的标签tag为(Player),设置层layer为BlockingLayer(碰撞检测层)。
4.在Player物体中Sprite Renderer 组件中的Sorting layer里面添加好标签,选择Units。(区分地板floor、食物items、人物Units)
5.在Player物体上添加Box Collider 2D 和Rigidbody 2D组件,勾选上Is Kinematic选项或者在Body Type中选择Kinematic(版本不一样的情况),因为不需要人物飞来飞去的,只需要走格子。
6.设置BOX大小Size的x和y都改为0.9,防止移动时不必要的碰撞,把Player物体拖拽到Prefabs文件夹保存Player预制体。
7.建空命名为Enemy1,添加闲时动画Enemy1Idle(6-11)和攻击动画Enemy1Attack(42-43),添加Box Collider 2D 和Rigidbody 2D,设置标签(Enemy),设置层(BlockingLayer),设置Sorting Layer为Units,勾选Is Kinematic选项,保存预制体到Prefabs文件夹。
8.修改Enemy1命名为为Enemy2,拖入Enemy2Idle动画(12-17)和Enemy2Attack动画(44-45)。
9.Enemy1动画的控制器拖到AnimationController文件夹,打开Enemy1动画控制器删除Enemy2相关的状态,在AnimationController文件夹中创建Animator Override Controller,命名为Enemy2,拖拽Enemy1动画控制相关联,然后拖入对应的Enemy2的动画(Idle与Attack)。
10.Enemy2物体的Animator控制器拖拽选择Enemy2的Override Controller进行替换,保存Enemy2的预制体。
(通过这节可以学习到:动画的创建、同类动画的相关联、层的设置)
(Layer关系到光和碰撞选择,SortingLayer关系到渲染顺序)
第三课 创建格子地图预制件(墙,食物,苏打水,出口预制体)
1.创建空命名为floor1,添加Sprite Renderer,选择第一个地板图片(序号32),Sorting Layer中选择Floor,保存Prefabs。
2.重命名为其他的地板和对应图片并且保存预制体(floor2-8)(图片序号33-39)。
3.创建Exit,添加Sprite Renderer,加入图片(20)添加Box Collider 2D组件,勾选Is Trigger,Sprite Renderer中 Sorting Layer 为Items(主角之下,地板之上),Tag为Exit,保存Prefabs。
4.Exit的同样方法创建Food,创建Soda,Layer可以不修改因为没有挡到主角(Items、It Trigger、保存预制体)。
5.创建OuterWall1(25),用到BoxCollider2D但不用勾选Is Trigger(阻止主角移动到场景外),Tag选择Untagged,Layer选择BlockingLayer,Sorting Layer 选择Floor(和地板一样是场景的一部分),创建OuterWall2(26)和OuterWall2(28),改图片分别保存。
6.与外墙一样方法创建Wall1(21),Sorting Layer选择Item,Layer选BlockingLayer,同样方法创建2至8。(22-24、27、29-31)
(总结:2D游戏的场景基本创建,区分互动物体和场景静止物体)
第四课 关卡管理器
1.创建两个脚本,BoardManager和GameManager,创建空命名为GameManager。
2.编辑BoardManager。
using UnityEngine;
using System;
using System.Collections.Generic; //序列化
using Random = UnityEngine.Random; //使用的是Unity的列表
namespace Completed
{
public class BoardManager : MonoBehaviour
{
[Serializable]
public class Count
{
public int minimum; //最小
public int maximum; //最大
//Assignment constructor.
public Count (int min, int max)
{
minimum = min;
maximum = max;
}
}
public int columns = 8; //列数
public int rows = 8; //行数
public Count wallCount = new Count (5, 9); //上下限
public Count foodCount = new Count (1, 5); //上下限
public GameObject exit; //离开的预制体
public GameObject[] floorTiles; //地板数组
public GameObject[] wallTiles; //墙数组
public GameObject[] foodTiles; //食物数组
public GameObject[] enemyTiles; //敌人数组
public GameObject[] outerWallTiles; //外墙数组
private Transform boardHolder; //一个变量,用来存储对Board对象转换的引用。
private List <Vector3> gridPositions = new List <Vector3> (); //放置瓷砖的可能位置列表。
//清除列表网格位置,并准备生成一个新的区域
void InitialiseList ()
{
//清除我们的列表网格位置。
gridPositions.Clear ();
//循环通过x轴(列)。
for (int x = 1; x < columns-1; x++)
{
//在每一列中,循环通过y轴(行)
for (int y = 1; y < rows-1; y++)
{
//在每个索引处用该位置的x和y坐标向列表添加一个新的Vector3。
gridPositions.Add (new Vector3(x, y, 0f));
}
}
}
//设置游戏板的外墙和地板(背景)
void BoardSetup ()
{
//实例化Board并将boardHolder设置为它的转换
boardHolder = new GameObject ("Board").transform;
//沿着x轴进行循环,从-1(填满墙角)开始铺地板或外墙边砖
for (int x = -1; x < columns + 1; x++)
{
//沿y轴旋转,从-1开始放置地板或外墙瓷砖
for (int y = -1; y < rows + 1; y++)
{
//从我们的地砖预制件数组中随机选择一个tile,并准备实例化它
GameObject toInstantiate = floorTiles[Random.Range (0,floorTiles.Length)];
//检查我们当前的位置是否在板的边缘,如果是这样,从我们的外墙瓷砖数组中随机选择一个外墙预制件
if (x == -1 || x == columns || y == -1 || y == rows)
toInstantiate = outerWallTiles [Random.Range (0, outerWallTiles.Length)];
//使用prefab实例化GameObject实例,该prefab选择用于在循环中当前网格位置对应的Vector3处实例化,并将其转换为GameObject
GameObject instance =
Instantiate (toInstantiate, new Vector3 (x, y, 0f), Quaternion.identity) as GameObject;