拾荒者2D开发笔记

本文章为记录游戏开发学习过程中的笔记,仅供学习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;

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值