Unity塔防游戏开发

时间:2024-05-21 10:04:08

Unity3D塔防开发流程

配置环境及场景搭建
编程语言:C#,略懂些许设计模式,如果不了解设计模式,BUG More
开发工具:Unity3D编辑器、Visual Studio编译器
开发建议:
了解Unity3D灯光,音频,物理,粒子特效,动画,NGUI,UGUI模块参数
了解Unity3D Network网络模块参数
了解Unity3D原生GUI
地形创建
鼠标左键单机Hierarchy面板中的Create
鼠标移动触摸3D Object
鼠标左键单机Cube
浏览Scene视图中的Cube对象
鼠标左键单机Cube对象
鼠标左键单机Cube对象的一条数轴并移动
鼠标左键单机Inspector中的Transform组件右侧的设置图标
鼠标移动触摸Resert
鼠标左键单机Resert进行重置Cube对象的位置,旋转角度,大小缩放
鼠标左键单机Hierarchy面板中的Cube对象
触发键盘Ctrl同时触发D键进行自动复制Cube对象
鼠标左键单机Scene视图中的Cube对象中的一条数轴并移动
继续移动并浏览Inspector视图中Transform组件中的x,y,z
继续移动并设置Inspector视图中Transform组件中的轴x,y,z一个值
停歇移动
鼠标左键单机Cube对象
触发键盘Ctrl同时触发D键进行自动复制对象
鼠标左键单机Scene视图中的Cube对象中的一条数轴并移动
继续移动并浏览Inspector视图中Transform组件中的x,y,z
继续移动并设置Inspector视图中Transform组件中的x,y,z
继续移动并保持x,y,z的值为n(推荐1.5开始,依次乘2)
停歇移动并重复复制Cube直到Cube数量达到所需要塔防网格一列个数(推荐10个)
鼠标左键单机Scene视图或Hierarchy视图中Cube对象同时触发键盘中的Ctrl键
持续触发Ctrl键,松下鼠标左键
持续触发Ctrl键,鼠标左键依次单机其它的Cube对象
松下Ctrl键
触发Ctrl键同时触发D键复制Cube对象
松下键盘与鼠标
鼠标左键单机Scene视图中Cube对象中的一条数轴同时进行移动一条数轴
松下鼠标左键,浏览Inspector视图中的x,y,z
调节Inspector视图中的x,y,z的值,(推荐1.5开始,依次乘2)
鼠标左键单机Cube对象
持续单机并触发键盘Ctrl键与
松下鼠标左键,鼠标左键依次单机目前一列Cube
松下鼠标左键,触发键盘Ctrl键与D键进行复制Cube对象
复制Cube n列(推荐10列)
检测每列/每行Cube在Inspector视图中Transform组件中的x,y,z的值
检测每一轴是否成某倍数依次相增
第1步地形构建完成,喝杯水休息1分钟
地形设计
鼠标左键单机Scene视图中的Cube
持续单机鼠标,并触发键盘Ctrl键
松下鼠标,持续触发Ctrl键进行选择Scene视图中的Cube对象
鼠标右键单机Cube对象
松下鼠标
鼠标移动触摸Delete
鼠标左键单机Delete删除当前选择的Cube对象
松下鼠标左键
鼠标左键单机Hierarchy视图中的一个Cube对象
持续单机,并触发键盘Ctrl键与D键进行复制2次
松下鼠标,鼠标左键单机新复制的2个对象
松下鼠标,触发键盘F2键
键盘输入字符为新复制2个对象的名称,不能为中文(推荐StartPoint,EndPoint)
松下鼠标与键盘
单机project视图中的Create
鼠标移动触摸Material并单机创建Material
将创建的Material材质拖拽到Cube
触发键盘Ctrl键与键盘D键复制Material材质
分别给材质重命名(重命名鼠标单机Hierarchy中的对象按下F2键)
并设置Inspector面板中的材质颜色
地形统一
创建1个空物体选中所有的Cube拖拽到空物体
收拉空物体
道路创建
创建两个Cube并重置Transform组件
一个作为Start开始位置,用于存放妖怪生成的Cube
一个作为End终点位置,用于销毁妖怪与判断游戏失败的Cube
创建两个材质赋值给这两个对象
计算之前被删除Cube的个数及行数,通过计算在被删除Cube的位置重新创建新的Cube并不留空格,只留与非道路的Cube处留0.5~1的空格
道路设计
道路设计部分需要使用一些数学运算,虽然都是些简单的运算,但是在设计过程中确实不能出一点差错,这一步一定要认真计算,认真留意.
鼠标左键单机新创建的Cube,并将Cube向道路内侧稍微移动使其刚好与它在同一行的代码平齐
道路统一
(1)创建一个空物体,将所有的道路物体拖拽到空物体中并收拉
核查地形
重复检验上述建造地形是否足够精致,或是否满足自己需求,
调整地形与道路
妖怪生成移动管理
妖怪创建
鼠标左键单机Hierarchy面板中的Create
鼠标移动触摸3DObject
鼠标左键单机3DObject中的Sphere创建一个球体
鼠标左键单机Hierarchy面板中的Sphere触发键盘F2键并重命名为Enemy(*命名)
在project面板中创建一个存放预设体的文件夹,将这个球体拖入预设体
在project面板中创建一个存放材质的文件夹,并创建一个材质拖拽到球体上
鼠标左键单机Hierarchy面板中的球体
鼠标左键单机球体的Inspector面板中的完成Apply表示更新完成
妖怪设计
将妖怪的对象从project面板拖拽到Hierarchy面板中
创建新的材质,并复制妖怪,将材质拖拽到妖怪上
自定义修改调整妖怪的参数,设置成自己的需求
妖怪路径点设置
计算道路上的转弯处
道路上每一道转换处等于一个转弯点,这个点即是路径点
在每个路径点的*创建一个空对象(建议使用Cube对象)之后完成后删除Mesh组件即可
路径点完成后再建立一个空物体,将所有的路径点拖拽到空物体中并收拉
创建一个脚本控制路径点
脚本中创建一个路径点的数组,其中数组的长度为子对象的数量,通常用transform.GetChildCount()获取子对象的数量长度
脚本绑定到路径点的管理对象上(路径点的父对象)
在Awake方法中获取路径点父对象的子物体也就是获取路径点,但是因为脚本绑定在父对象上,所以要获取子对象.
获取到子对象以后使用一个for循环遍历这个数组,遍历条件一般是i不大于数组的长度,也就是不大于子对象的数量,遍历一般是获取到数组的下标,使数组的下标等于子对象的的排序数量,例如positions[i]=transform.GetChild(i);
路径点管理完成
4.妖怪路径点脚本控制与妖怪移动原理
(1)创建一个脚本用于管理妖怪所有功能及信息
(2)获取路径点的数组,并给它赋一个值
(3)创建一个新的方法,用于使妖怪移动到路径点,并在Update方法中调用
(4)定义一个index,表示数组的下标,用于判断属于数组的哪一个下标
(5)首先进行一个判断,如果index超出数组的长度,则返回.如果index没有超出,将会继续执行移动方法中的程序,妖怪移动到下一路径点一般==下一个路径点的位置减去当前所在位置的方向乘以一个速度变量和时间变量,例如(position[index].position-tranform.position).normalized*speed*Time.deltatime
(6)上述路径点表示从开始位置移动到第一个下标路径点的位置,移动结束就会卡在第一个路径点的位置,但是后面还有路径点,所以不能让妖怪卡在一个方向,要转换方向,转换方向使用Distance,例如判断移动路径点的方向为Vector3.Distance(positions[index].position,tranform.position)<0.2f,当条件成立即index
5.核查妖怪参数与路径脚本
开发塔防“四冲程”
“进气冲程”:导入炮塔
在计算机系统中查询到Unity塔防素材
鼠标左键双击Unity塔防素材
素材成功导入到Unity
在Unity Project面板中创建一个文件夹
将素材拖拽到文件夹中
“压缩冲程”:重整炮塔
查看存储炮塔的文件夹,查询炮塔及其它素材的参数
拖拽一个炮塔到Scene视图上进行修改
将炮塔放置在Cube上的适当位置
鼠标左键单机炮塔
调整炮塔的Inspector面板中的参数
给炮塔添加材质
给炮塔的子对象添加材质
在Project面板中的Prefab预设体文件夹创建一个同炮塔名的文件夹
将完成的炮塔移动到文件夹中
另外创建其它的炮塔
“作工冲程”:设计炮塔
界面视觉设计:
1)鼠标左键单机Hierarchy面板中的Create
2)鼠标移动触摸UI一栏
3)鼠标左键单机RawImage创建一个RawImage对象
4)鼠标左键单机RawImage对象在Inspector面板中的Textrue旁边的圆圈图标更替一个材质
5)鼠标左键单机Hierarchy面板中的Create
6)鼠标移动触摸到UI一栏
7)鼠标左键单机Text创建一个Text对象
8)并设置Text对象在Inspector面板中的text属性
9)创建一个空物体封装Text对象和RawImage对象并收拉
10)复制三个,并赋给新复制的两个新的材质[其它的炮塔]
界面选择设计:
为复制的三个游戏对象添加一个Toggle组件
并为它们添加一个image对象,并将image在inspector面板的材质替换成一个圆形材质
每个对象的圆形材质分别拖入他们自己的toggle组件中的Graphic属性中
界面单选设计:
1)三个游戏对象的空的父物体拖拽到它们的Group属性中

“排气冲程”:开发炮塔
数据存储:
创建一个脚本,用于存储炮塔的数据,表示炮塔数据存储类
因为是存储炮塔的数据,仅需要有一个类即可,不需要继承于monobehavior接口,
也不要使用unity自带的函数,所以接口继承和Start和Update两个函数可以删除
创建一个GameObject类型的游戏对象表示炮塔实例化后的对象
创建一个int类型的变量作为炮塔实例化所需要的价格
创建一个GameObject类型的游戏对象表示炮塔升级后的对象
创建一个int类型的变量作为炮塔升级所需要的价格
此脚本由于是用于存储数据的类,所以不需要绑定给任何游戏对象,仅需存储在工程资源文件夹中即可
监听炮塔:
创建一个脚本,用于监听炮塔选择界面的点击选择事件
引用UGUI的命名空间(using UnityEngzine.UI)
创建三个公有化炮塔数据类的游戏对象表示三种炮塔
创建三个方法,每一个方法表示选择一个炮塔
创建一个私有化炮塔数据类的游戏对象表示选中的炮塔
在每个方法中都加上一个bool类型的参数表示是否选择此炮塔
在每个方法中都进行一个if语句判断,判断是否选择炮塔,判断选择为true
在每个方法的每个条件中,给私有化用来选中炮塔的游戏对象赋一个值,该值为该炮塔所对应的游戏对象,完成后保存记录
创建一个空物体并清除还原Transform组件
将脚本绑定给这个空物体
将这个空物体拖拽到Hierarchy面板中炮塔选择界面的Inspector面板中的toggle响应,并调用炮塔对应的方法
点火校正:
1)在每个方法中的每个条件中加入一个Debug.Log输出一下炮塔的游戏对象,确定是否相符,如不是,检查并修改
六、塔防“发动机”
1.检测鼠标触发地面网格
(1)打开炮塔选择事件的脚本(监听炮塔的脚本)
(2)在Start方法中判断一次鼠标左键点击事件if(Input.GetMouseButtonDown(0)){}
(3)在这个条件中创建一条射线并赋值,这个值为主摄像机发射到屏幕的鼠标位置
Ray ray = Camera.main.IsScreenPointToRay(Input.MousePosition);
在这个条件中创建一个射线碰撞对象
Raycasthit hit;
在这个条件中创建一个bool类型的变量表示是否碰撞到某某对象,意思就是检测碰撞到了什么对象层,在Unity中每个游戏对象的Inspector面板上都有一个Layer,这个表示层,点击即可选择层,也可以创建一个层,之后选择这个层
bool iscollider = Physics.Raycast(射线,这个一般是out hit,最大区域,一般是1000,LayerMask.GetMask(“获取层级的名称”));
因为Unity自带一个检测UI的事件类EventSystem,所以需要在射线检测前加上一个条件,条件判断未检测到UI事件类,并且调用EventSystem的命名空间using UnityEngzine.EventSystem;
If(EventSystem.current.IsPointerToRay()==false){将上列的射线检测剪切粘贴到此处}
实例化创建炮塔
创建一个脚本,用于放置炮塔到Cube上也就是Cube上的一个空物体
在这个脚本中声明一个GameObject类的游戏对象
在这个脚本中,创建一个实例化炮塔的方法,并带上一个GameObject类的对象参数
实例化炮塔
GameObject.Instaniate(炮塔的对象不是这个方法的参数,transform.position,transform.rotation) as GameObject;并将这条语句作为一个值给声明的游戏赋值
返回选择炮塔和射线检测的脚本,在射线检测后声明一个炮塔类的对象,并获取到射线碰撞对象的实例化炮塔的组件也就是获取到实例化炮塔的类
例如:MapCube mapcube=collider.gameObject.GetComponent<MapCube>();
用一个if语句判断mapcube中的那个游戏对象,也就是实例化炮塔类中的那个游戏对象不等于空的情况,如果等于空,实例化创建炮塔,如果不等于空,打开升级出售UI界面
例如If(TurretGo!=null){创建炮塔}   else{升级出售}
创建炮塔只需要调用实例化炮塔类中的实例化炮塔的方法,并给方法传入参数,传如参数是之前声明的炮塔数据类的当前选择的炮塔
例如:mapcube.Create(TurretToggle);
但是创建炮塔后,炮塔的价格和炮塔的金币并未起到作用,因此下面便是炮塔的金币控制方法
金币管理
创建金币: 在Hierarchy面板中创建一个text对象,表示金币的对象,用于显示当前金币,继续在这个脚本中引用using UnityEngzine.UI这个命名空间,声明一个Text类型的金币对象,并在Start方法中获取到这个对象的Text组件
例如:public Text gold; void Start(){ gold=gold.GetComponent<Text>(); }
创建金币管理方法:在这个脚本中创建一个方法,用于存储与控制金币,等同于金币的入口生产点,创建一个变量,表示金币的初始值,可以设置一个初始值,在金币管理方法中添加一个int类型的参数表示更新金币的变量,不需要赋初始值,方法中表示金币的对象 “.text”等于”¥” 初始金币,初始金币 =更新金币
例如:public int money;void Money(int changeMoney){gold.text=”¥” money; money =changeMoney;}
设置炮塔金币购买条件:在射线检测后创建炮塔处为创建炮塔的执行语句添加一个if条件判断,判断如果金币大于或等于当前选择炮塔中的炮塔数据类中购买价格,才会创建炮塔,否则播放一个金币不足动画的提示
例如:if(money>=selectedTurretObject.price){mapcube.Create(selectedTurretObject);}
炮塔初始建造特效实例与销毁
在实例化炮塔的那个类中,声明一个游戏对象,并在Unity3DInspector面板中给游戏对象赋值,该值为炮塔的建造的特效
例如:public GameObject bulitTurretEffect;
在实例化炮塔的那个类里实例化炮塔的方法中实例化炮塔的执行语句下一行执行生成建造特效,并在一定时间内销毁
例如:bulitTurretEffect = GameObject.Instaniate(声明的炮塔建造特效,transform.position,transform.rotation)as GameObject;Destroy(bulitTurretEffect,多久销毁时间);
建造特效:鼠标左键单机Hierarchy面板中的Create,创建一个Particle System对象,这个对象指的是Unity3D的粒子对象,Unity3D的特效一般从此处调节这个对象的Inspector面板的Particle System组件的参数,创建好特效,将特效拖拽到Project面板中的Prefab文件夹下
炮塔射击触发检测空间设计
将炮塔拖拽到Hierarchy面板进行设置
开启炮塔的触发检测,鼠标左键单机勾选炮塔的Inspector面板中的Is Trigger
调节触发区域大小,判断妖怪是否进入触发区域,如果进入执行一些事件
创建一个脚本,在OnTriggerEnter方法中,添加一个Collider类型的参数
将这个脚本绑定炮塔
设置妖怪,炮塔等场景各个游戏对象的tag,不能相同
在OnTriggerEnter方法中用一个if语句进行判断,如果tag为妖怪的tag,则表示妖怪进入了触发区域,作出一些响应.
声明一个List<GameObject>集合,用于存储进入触发区域的妖怪,如果妖怪进入,则这个集合调用它的add方法,将碰撞的妖怪添加到集合中
在OnTriggerExit方法中用一个if语句进行判断,如果tag为妖怪的tag,则表示妖怪离开了触发区域,如果妖怪离开了触发区域,则这个集合将会调用removeat方法将其移除该集合
Debug.Log调试触发方法及内部的条件语句,确保无BUG
5.炮塔射击对象与炮弹的实例化及相关处理
将炮塔拖拽到Hierarchy面板中进行设置
创建一个空物体并重置Transform组件
调整空物体的位置正好处于炮塔炮口的位置
将这个空物体拖拽到炮塔对象内,作为炮塔的子对象,并取名为炮塔炮口位置相关名称
创建一个球体对象,重置Transform组件并添加刚体组件且刚体取消重力,碰撞体开启触发检测
设置球体的大小,符合自己的规范即可,另外创建或导入另外两个炮塔的炮弹对象
打开炮塔触发检测的脚本
声明炮塔的炮弹对象并赋值
例如:public GameObject bulletObject;
实例化射击对象,创建一个方法,在这个方法中实例化炮弹对象
例如:bulletObject = GameObject.Instaniate(炮弹对象,tranform.position,transform.rotation) as GameObject;
炮弹目标点:
在炮塔触发脚本中,创建一个Transform类型的变量作为目标点
创建一个设置目标点的方法SetTarget
在这个方法中添加一个Transform类型的参数变量
例如:public Transform target; public void SetTarget(Transform target){ this.target=target; }
炮弹碰撞处理脚本
1)为炮弹添加Collider组件
2)启用触发器勾选isTrigger
3)创建一个炮弹触发处理的脚本并赋值给炮弹
4)在炮弹触发处理脚本中的OnTriggerEnter方法中添加一个Collider类型的参数
5)用一个if语句进行判断碰撞器Collider参数对象的碰撞对象的tag属性为妖怪的tag
6)如果tag为妖怪标签,调用炮弹销毁的方法及其它妖怪处理以及炮弹销毁特效等处理

七、塔防“底盘”
1.妖怪血量管理
(1)妖怪血量:
1)创建一个UGUI Slider对象
2)设置对象在妖怪正上方
(2)妖怪血量处理:
1)在妖怪数据脚本中添加一个血量属性
2)并在脚本中添加一个Slider类型的对象并获取Slider组件和场景中的对象
3)创建一个Slider血条跟随妖怪的方法
4)在设置位置同步妖怪位置正上方一段距离
5)创建一个Slider血量减少与增加管理的方法
6)在这个方法参数列表中添加一个血量消耗值的参数
并在方法中赋值给妖怪的血量属性
7)在炮塔碰撞处理脚本中的触发检测后调用血量控制的方法
2.炮塔升级处理

炮塔出售处理
/炮塔出售:射线检测碰撞,如果鼠标左键碰撞到炮塔对象弹出炮塔升级面板,点击炮塔升级面板中的炮塔出售按钮进行销毁当前选择的炮塔/

拓展功能
局域网:详情Unity Component 中 Network主要组件
Network Manger:网络通信核心组件,必备,可设置网络服务端IP地址与端口号等
Network HUD:网络通信测试组件,通常用于测试运行游戏阶段
Network Identity:同步对象到局域网,其它客户端连接到服务端后同步生成的对象
Network Transform:同步对象位置到局域网
Network Animation:同步对象动画状态到局域网
AI:详情Unity Windows中导航烘焙窗口,用于实现使某对象进行自动寻路等操作
Light:详情 Unity Windows中灯光烘焙窗口,用于烘培灯光及场景为材质
Json 与 Xml:详情 一个数据存储的文本标记语言,用于存储数据