当前位置:   article > 正文

脚本动态拼接地板_unity地板向上拼接

unity地板向上拼接

这里开始笔记的第一节,关于教程制作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、 编辑脚本如下所示:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Ryun : MonoBehaviour
  5. {
  6. public Vector3 cellcount = Vector3.zero;//声明一个Vector3类型的公有变量,名为cellcount,初始化为zero,用于记录动态加载的地板数量;
  7. public Vector3 floorsize = Vector3.zero;//声明一个同样类型的公有变量,名为floorsize,初始化为zero,用于动态记录单个地板的长宽高;
  8. public List<Transform> floortransform = new List<Transform>();
  9. //声明一个泛型变量(后面有关于它的补充),以Transform类型为参数,命名为floortransform,并将该类下定义好的childrentransforms[i]中的游戏对象添加进去。(这是后面的过程)
  10. // Start is called before the first frame update
  11. void Start()
  12. {
  13. }
  14. // Update is called once per frame
  15. void Update()
  16. {
  17. }
  18. [ContextMenu("floor lay out")]
  19. //由于我们是对场景做动态改变,故在外面声明一个私有的无返回值的函数,命名为floorlayout(),由于我们需要在游戏未运行的时候能调用该方法,ContextMenu()能实现这一点,具体可参考unity官方的中文文档。
  20. private void floorlayout() {
  21. floortransform.Clear();
  22. //介于后续可能需要修改。故在每次调用方法前将floortransform里的对象清除,这里用了Clear()方法。
  23. var childrentransforms = this.GetComponentsInChildren<Transform>();
  24. //在函数体内隐式声明一个变量,为方便识别,命名为childrentransforms,并利用GetComponentsInChildren<>赋予其含Transform组件下的所有子物体组件。
  25. //GetComponentsInChildren<>用于返回 GameObject 或其任何子项中类型为Transform的所有组件;Unity 以递归方式在子 GameObject上搜索组件。这意味着它还包含目标GameObject的子GameObject以及所有后续子GameObject。
  26. //(由于其将找到的所有组件均返回到 List results 中,故书写childrentransforms.Length;childrentransforms[i]就能很好理解其缘由。)
  27. for (int i = 1; i < childrentransforms.Length; i++)
  28. //通过for循环,这里注意由于不能包含groundfloor故在添加子对象的时候将变量索引值初始化为i=1,利用Add()方法将这些录入。
  29. {
  30. if (childrentransforms[i].gameObject.CompareTag("floor")) {
  31. floortransform.Add(childrentransforms[i]);
  32. }
  33. }
  34. int currentindex = 0;//循环前先写一个 int currentindex = 0;
  35. //利用双重for循环改变每个子物体的世界坐标的位置:
  36. for (int x=0 ; x < cellcount.x; x++) {
  37. for (int z = 0; z < cellcount.z; z++) {
  38. Vector3 newpos = new Vector3(x * floorsize.x, 0, z * floorsize.z);
  39. //先声明并实例化一个Vector3类型的位置坐标,关于坐标点的位置变化自己思考。
  40. floortransform[currentindex].position= newpos;
  41. //含义是每次定义好的newpos坐标赋予给当前的floortransform下的childrentransforms对象
  42. currentindex++;
  43. //一次内部循环结束后自增currentindex。
  44. }
  45. }
  46. }
  47. }

补充

<补1>

  1. if (childrentransforms[i].gameObject.CompareTag("floor")) {
  2. floortransform.Add(childrentransforms[i]);
  3. }

获取当前transform组件所在的gameobject,并利用gameobject下的CompareTag()方法找到标签为floor的游戏对象,这是为了防止将不需要的子对象添加进floortransfrom的缘故

*标签需要自己在游戏对象的Inspectors窗口的tab选项里添加并修改。

<补2>:

声明一个泛型变量的格式:

List<数据类型> 变量名=new list<数据类型>();

注意:

  1. 1:List泛型集合只能使用Add()方法添加元素
  2. 2:一旦元素添加成功,指定下标修改集合中的元素
  3. 3:List泛型集合和数组一样,其下标是从0开始的

List泛型集合的常用方法

  1. 1.Add()方法,添加元素的方法。
  2. 2.Clear()方法,无返回值,清空集合中的所有元素
  3. 案例:清空ListNew集合中的所有元素
  4. listNew.Clear();
  5. 3.Contains()方法,返回布尔型数据,参数为集合中元素的数据类型
  6. 功能:检查集合中是否存在某元素
  7. 案例:检查listNew集合中是否存在字符串元素"一号元素"
  8. 代码:listNew.Contains("一号元素");
  9. 返回值为:true
  10. 4.Equals()方法,比较两个List泛型集合是否相等
  11. 举例,比较listNew集合与listold集合是否相等:
  12. 代码:listNew.Equals(listold); //本人就不声明listold集合了,理解Equals()方法即可。因为不常用。
  13. 5.Indexof()返回值为int,从索引位置0开始查找元素,并得到索引值
  14. 比如我们要在listNew集合中查找元素"四号元素"的第一个索引位置(考虑到有多个"四号元素的情况")
  15. 代码:
  16. listNew.Indexof("四号元素");
  17. 返回值为:3
  18. 6.Insert()方法,插入元素
  19. 如我们在listNew集合的索引位置3上插入"三点五号元素"
  20. listNew.Insert(3,"三点五号元素");
  21. 插入后元素数量变为增加了1,原来索引3位置上的元素在索引位置4上了,后面的元素全部向后移动了一格。
  22. 7.Remove()方法,删除指定元素
  23. 如我们删除刚刚添加的"三点五号元素"
  24. 代码:listNew.Remove("三点五号元素");
  25. 删除这个元素之后后面的元素会上移一个索引位置
  26. 8.RemoveAt()方法,根据索引位置删除元素
  27. 如:我们删除当前三号索引位置处的元素
  28. 代码:listNew.RemoveAt(3);
  29. 删除这个元素之后后面的元素会上移一个索引位置。
  30. 9.Reserve()方法,将集合中的所有元素反向排序
  31. 如,我们将listNew集合中的所有元素反向排序
  32. 代码:listNew.Reserve();
  33. 反向排序之后集合中元素的索引会有改变
  34. 10.ToArray()方法,将集合转换为数组
  35. 如我们将listNew集合转换为一个string数组
  36. string[] str=listNew.ToArray();


结果

最后结果如下:

(动态更改结果如图所示,当然数值可以自己进一步修改)

演示图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/97917
推荐阅读
相关标签
  

闽ICP备14008679号