赞
踩
这里开始笔记的第一节,关于教程制作fps.microgame游戏的内容,由于本人水平十分有限,笔记主要是给自己做知识储备和整理用的,如需使用,则自酌其中的笔记内容,不合理之处肯定存在,希望一起指正、学习。
教程b站链接:Unity官方FPS零基础教程最新资源Microgame角色设定制作/游戏制作/游戏开发/特效展示/特效制作(角色开发/角色设计)B0418_哔哩哔哩_bilibili
全套视频教程及源码获取 添加WX:coco-zhaoxi 发送B0418。
——下面利用脚本动态拼接地板,便于生成和管理
1、首先导入相应场景资源,在Hierarchy窗口里添加预制体HoveBot。
2、将RootObject文件夹里的OBJBasic_Floor拖进hierarchy视图中,命名一个空物体,取名groundfloor,将该预制体拖进空物体下进行,现在我们可以在groundfloor的组件里添加脚本来动态拼接其子物体地板。
3、新建一个C#脚本,脚本自己命名好后点击进入编辑,这里使用的编辑器是visual studio 2019版本。
4、 编辑脚本如下所示:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class Ryun : MonoBehaviour
- {
- public Vector3 cellcount = Vector3.zero;//声明一个Vector3类型的公有变量,名为cellcount,初始化为zero,用于记录动态加载的地板数量;
- public Vector3 floorsize = Vector3.zero;//声明一个同样类型的公有变量,名为floorsize,初始化为zero,用于动态记录单个地板的长宽高;
- public List<Transform> floortransform = new List<Transform>();
- //声明一个泛型变量(后面有关于它的补充),以Transform类型为参数,命名为floortransform,并将该类下定义好的childrentransforms[i]中的游戏对象添加进去。(这是后面的过程)
-
- // Start is called before the first frame update
- void Start()
- {
-
- }
-
- // Update is called once per frame
- void Update()
- {
-
- }
-
- [ContextMenu("floor lay out")]
- //由于我们是对场景做动态改变,故在外面声明一个私有的无返回值的函数,命名为floorlayout(),由于我们需要在游戏未运行的时候能调用该方法,ContextMenu()能实现这一点,具体可参考unity官方的中文文档。
- private void floorlayout() {
-
- floortransform.Clear();
- //介于后续可能需要修改。故在每次调用方法前将floortransform里的对象清除,这里用了Clear()方法。
- var childrentransforms = this.GetComponentsInChildren<Transform>();
- //在函数体内隐式声明一个变量,为方便识别,命名为childrentransforms,并利用GetComponentsInChildren<>赋予其含Transform组件下的所有子物体组件。
- //GetComponentsInChildren<>用于返回 GameObject 或其任何子项中类型为Transform的所有组件;Unity 以递归方式在子 GameObject上搜索组件。这意味着它还包含目标GameObject的子GameObject以及所有后续子GameObject。
- //(由于其将找到的所有组件均返回到 List results 中,故书写childrentransforms.Length;childrentransforms[i]就能很好理解其缘由。)
- for (int i = 1; i < childrentransforms.Length; i++)
- //通过for循环,这里注意由于不能包含groundfloor故在添加子对象的时候将变量索引值初始化为i=1,利用Add()方法将这些录入。
- {
- if (childrentransforms[i].gameObject.CompareTag("floor")) {
-
- floortransform.Add(childrentransforms[i]);
- }
-
-
-
-
- }
-
- int currentindex = 0;//循环前先写一个 int currentindex = 0;
- //利用双重for循环改变每个子物体的世界坐标的位置:
- for (int x=0 ; x < cellcount.x; x++) {
-
- for (int z = 0; z < cellcount.z; z++) {
-
- Vector3 newpos = new Vector3(x * floorsize.x, 0, z * floorsize.z);
- //先声明并实例化一个Vector3类型的位置坐标,关于坐标点的位置变化自己思考。
- floortransform[currentindex].position= newpos;
- //含义是每次定义好的newpos坐标赋予给当前的floortransform下的childrentransforms对象
- currentindex++;
- //一次内部循环结束后自增currentindex。
-
- }
-
- }
-
-
-
- }
- }
<补1>
- if (childrentransforms[i].gameObject.CompareTag("floor")) {
-
- floortransform.Add(childrentransforms[i]);
- }
获取当前transform组件所在的gameobject,并利用gameobject下的CompareTag()方法找到标签为floor的游戏对象,这是为了防止将不需要的子对象添加进floortransfrom的缘故
*标签需要自己在游戏对象的Inspectors窗口的tab选项里添加并修改。
<补2>:
声明一个泛型变量的格式:
List<数据类型> 变量名=new list<数据类型>();
注意:
- 1:List泛型集合只能使用Add()方法添加元素
-
- 2:一旦元素添加成功,指定下标修改集合中的元素
-
- 3:List泛型集合和数组一样,其下标是从0开始的
- 1.Add()方法,添加元素的方法。
-
- 2.Clear()方法,无返回值,清空集合中的所有元素
- 案例:清空ListNew集合中的所有元素
- listNew.Clear();
-
- 3.Contains()方法,返回布尔型数据,参数为集合中元素的数据类型
- 功能:检查集合中是否存在某元素
- 案例:检查listNew集合中是否存在字符串元素"一号元素"。
- 代码:listNew.Contains("一号元素");
- 返回值为:true。
-
- 4.Equals()方法,比较两个List泛型集合是否相等
- 举例,比较listNew集合与listold集合是否相等:
- 代码:listNew.Equals(listold); //本人就不声明listold集合了,理解Equals()方法即可。因为不常用。
- 5.Indexof()返回值为int,从索引位置0开始查找元素,并得到索引值
- 比如我们要在listNew集合中查找元素"四号元素"的第一个索引位置(考虑到有多个"四号元素的情况")
- 代码:
- listNew.Indexof("四号元素");
- 返回值为:3。
-
- 6.Insert()方法,插入元素
- 如我们在listNew集合的索引位置3上插入"三点五号元素"
- listNew.Insert(3,"三点五号元素");
- 插入后元素数量变为增加了1,原来索引3位置上的元素在索引位置4上了,后面的元素全部向后移动了一格。
-
- 7.Remove()方法,删除指定元素
- 如我们删除刚刚添加的"三点五号元素"
- 代码:listNew.Remove("三点五号元素");
- 删除这个元素之后后面的元素会上移一个索引位置
-
- 8.RemoveAt()方法,根据索引位置删除元素
- 如:我们删除当前三号索引位置处的元素
- 代码:listNew.RemoveAt(3);
- 删除这个元素之后后面的元素会上移一个索引位置。
-
- 9.Reserve()方法,将集合中的所有元素反向排序
- 如,我们将listNew集合中的所有元素反向排序
- 代码:listNew.Reserve();
- 反向排序之后集合中元素的索引会有改变
-
- 10.ToArray()方法,将集合转换为数组
- 如我们将listNew集合转换为一个string数组
- string[] str=listNew.ToArray();
最后结果如下:
(动态更改结果如图所示,当然数值可以自己进一步修改)
演示图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。