根据输入的物体生成随机成组的物体.

  1 /// <summary>
  2 /// 本脚本可以由输入的预制 生成以本物体为中心的随机预制,支持预制打组
  3 /// 随机物体生成器(尤其试用于场景中静态物体随机摆放)
  4 /// </summary>
  5 using UnityEngine;
  6 using System.Collections;
  7 using System.Collections.Generic;
  8
  9 public class PrefabMixer : MonoBehaviour
 10 {
 11     [Tooltip("输入预制")]
 12     public GameObject[]
 13         inputPrefabs;
 14     [Tooltip("生成多少组")]
 15     public int
 16         maxGroupsNum = 3;
 17     [Tooltip("每组最多的个数")]
 18     public int
 19         maxEachGroupsNum = 5;
 20     [Tooltip("距离中心的距离")]
 21     public float
 22         distanceToSpawn = 50f;
 23     [Tooltip("缩放范围")]
 24     public float
 25         scaleToSpawn = 5f;
 26
 27     //一共生成多少组
 28     public List<Transform> asteroidsGroupList = new List<Transform> ();
 29     //生成的陨石总数
 30     private List<Transform> asteroidsList = new List<Transform> ();
 31
 32     private Transform _cacheTransform;
 33
 34     void OnEnable ()
 35     {
 36         ResetList ();
 37         _cacheTransform = transform;
 38         Debug.Log("Cache Transform !!");
 39     }
 40
 41     void OnDisable ()
 42     {
 43         ResetList ();
 44     }
 45
 46     public void GenerateAsteroids ()
 47     {
 48         if (inputPrefabs == null || inputPrefabs.Length <= 0)
 49         {
 50             Debug.LogError ("预制不能为空哦 !");
 51             return;
 52         }
 53
 54         if(_cacheTransform == null)
 55         {
 56             _cacheTransform = transform;
 57         }
 58
 59         int tempMap = 0;
 60         ResetList ();
 61         //按组数来判断
 62         while (asteroidsGroupList.Count < maxGroupsNum) {
 63
 64             Transform o = new GameObject ("AsteroidsMap_" + tempMap ++).transform;
 65             o.localPosition = _cacheTransform.position;
 66             o.localRotation = Quaternion.identity;
 67             o.localScale = Vector3.one;
 68             if(o.GetComponent<RotateSelf>() == null)
 69                 o.gameObject.AddComponent<RotateSelf>();
 70             o.GetComponent<RotateSelf>().speed = Random.Range(1,5f);
 71
 72
 73             for (int i = 0; i<Random.Range(1,maxEachGroupsNum + 1); i++) {
 74                 if (GetRandomPrefab () == null)
 75                     continue;
 76                 GameObject asteroid = Instantiate (GetRandomPrefab ()) as GameObject;
 77                 asteroid.transform.parent = o.transform;
 78                 asteroid.name = "asteroid_" + GetRandomPrefab ().name + "_" + i;
 79                 asteroid.transform.localRotation = Quaternion.Euler (Random.Range (0, 360), Random.Range (0, 360), Random.Range (0, 360));
 80                 asteroid.transform.localPosition = Random.insideUnitSphere * distanceToSpawn;
 81                 asteroid.transform.localScale = new Vector3 (Random.Range (1, scaleToSpawn), Random.Range (1, scaleToSpawn), Random.Range (1, scaleToSpawn));
 82
 83             }
 84             asteroidsGroupList.Add (o);
 85         }
 86     }
 87
 88     public void ResetList ()
 89     {
 90         for (int i = 0; i < asteroidsGroupList.Count && asteroidsGroupList.Count > 0; i++) {
 91             if(asteroidsGroupList [i] == null)
 92                 continue;
 93 //            #if UNITY_3_5
 94 //            asteroidsGroupList[i].gameObject.active = false;
 95 //            #endif
 96 //            asteroidsGroupList [i].gameObject.SetActive (false);
 97             DestroyImmediate(asteroidsGroupList [i].gameObject);
 98
 99         }
100
101         if (asteroidsGroupList.Count > 0)
102             asteroidsGroupList.Clear ();
103     }
104
105     GameObject GetRandomPrefab ()
106     {
107         if (inputPrefabs != null && inputPrefabs.Length > 0)
108             return inputPrefabs [Random.Range (0, inputPrefabs.Length)];
109         return null;
110     }
111
112 }

 1 /// <summary>
 2 /// Prefab mixer editor.
 3 /// </summary>
 4 using UnityEditor;
 5 using UnityEngine;
 6 using System.Collections.Generic;
 7
 8 [CustomEditor(typeof(PrefabMixer))]
 9 public class PrefabMixerEditor : Editor {
10     SerializedObject myTarget;
11
12     SerializedProperty maxEachGroupsNum;
13     SerializedProperty maxGroupsNum;
14     SerializedProperty distanceToSpawn;
15     SerializedProperty scaleToSpawn;
16     SerializedProperty GenerateAsteroids;
17 //    SerializedProperty asteroidsGroupList;
18
19
20     PrefabMixer prefabMixer;
21     private List<Transform> asteroidsGroupList = new List<Transform> ();
22
23     void OnEnable()
24     {
25         myTarget = new SerializedObject(target);
26
27         maxGroupsNum = myTarget.FindProperty("maxGroupsNum");
28         maxEachGroupsNum = myTarget.FindProperty("maxEachGroupsNum");
29         distanceToSpawn = myTarget.FindProperty("distanceToSpawn");
30         scaleToSpawn = myTarget.FindProperty("scaleToSpawn");
31 //        asteroidsGroupList = myTarget.FindProperty("asteroidsGroupList");
32
33         //获得实例
34         prefabMixer = target as PrefabMixer;
35         asteroidsGroupList = prefabMixer.asteroidsGroupList;
36
37     }
38
39     private bool _showPrefabs = true;
40
41     public override void OnInspectorGUI()
42     {
43         myTarget.Update();
44
45         EditorGUILayout.Separator();
46
47         _showPrefabs = EditorGUILayout.Foldout(_showPrefabs, "单个预制");
48         EditorGUIUtility.LookLikeInspector();
49         if (_showPrefabs) {
50             ArrayGUI(myTarget, "inputPrefabs");
51         }
52         EditorGUIUtility.LookLikeControls();
53
54         EditorGUILayout.Separator();
55
56         maxGroupsNum.intValue = EditorGUILayout.IntSlider("生成多少组", maxGroupsNum.intValue, 1, 1000);
57         EditorGUILayout.Separator();
58
59         maxEachGroupsNum.intValue = EditorGUILayout.IntSlider("每组最多的个数", maxEachGroupsNum.intValue, 1, 100);
60         EditorGUILayout.Separator();
61
62         distanceToSpawn.floatValue = EditorGUILayout.Slider("距离中心的距离", distanceToSpawn.floatValue, 1f, 100f);
63         EditorGUILayout.Separator();
64
65         scaleToSpawn.floatValue = EditorGUILayout.Slider("缩放范围", scaleToSpawn.floatValue, 1f, 10f);
66         EditorGUILayout.Separator();
67
68         if(GUILayout.Button("生成"))
69         {
70             prefabMixer.GenerateAsteroids();
71         }
72         EditorGUILayout.Separator();
73
74         if(GUILayout.Button("清空"))
75         {
76             prefabMixer.ResetList();
77         }
78         EditorGUILayout.Separator();
79
80         myTarget.ApplyModifiedProperties();
81     }
82
83
84     void ArrayGUI(SerializedObject obj, string name) {
85         int size = obj.FindProperty(name + ".Array.size").intValue;
86         int newSize = EditorGUILayout.IntField("数量", size);
87         if (newSize != size) obj.FindProperty(name + ".Array.size").intValue = newSize;
88         EditorGUI.indentLevel = 3;
89         for (int i=0;i<newSize;i++) {
90             var prop = obj.FindProperty(string.Format("{0}.Array.data[{1}]", name, i));
91             EditorGUILayout.PropertyField(prop);
92         }
93         EditorGUI.indentLevel = 0;
94     }
95 }

转载于:https://www.cnblogs.com/leesymbol/p/5018290.html

unity3d 随机物体生成器 工具相关推荐

  1. uniny 物体运动到一个点停止_隐藏的几何:各类随机物体中的深层联系

    在"SLE曲线"结构中,随机性增加 | 来源:Jason Miller 标准几何体能够用简单规则描述,比如通过y = ax + b定义每条直线,而且各要素之间的关系也相对明了:两点 ...

  2. Demon_接金币(三个掉落物品预设体,一接物体的工具)

    接物体的工具 using UnityEngine; using System.Collections;public class Tool : MonoBehaviour {float hor;Vect ...

  3. python随机数列_Python2随机数列生成器简单实例

    本文实例讲述了Python2随机数列生成器.分享给大家供大家参考,具体如下: #filename:randNumber.py import random while True: try: row=in ...

  4. Java随机数据生成器

    Java随机数据生成器 一.概述 简单易用的随机数据生成器.一般用于开发和测试阶段的数据填充.模拟.仿真研究.演示等场景. 可以集成到各种类型的java项目中使用. 二.优点 非常轻量级(不到1M), ...

  5. 【沐风老师】3DMAX橱柜生成器工具使用教程

    3DMAX橱柜生成器工具使用教程 [生成的橱柜模型] 3DMAX橱柜生成器(Kitchen Cabinet Creator)用于在3ds Max中自动制作橱柜模型.是需要频繁设计厨房.家具和室内设计的 ...

  6. 【分享】AI绘画提示词生成器工具

    哈喽,大家好,我是木易巷~ 今天,木易巷给大家带来AI绘画提示词生成器工具---PromptoMANIA. PromptoMANIA[AI绘画提示词生成器工具]   介绍 PromptoMANIA P ...

  7. js实现随机数字生成器代码

    js实现随机数字生成器代码,json在线格式化代码教程如下: 输入json代码 实现结果:格式化 js实现代码如下: //parser var jsl = typeof(jsl) === 'undef ...

  8. ITK:Mersenne Twister随机整数生成器

    ITK:Mersenne Twister随机整数生成器 内容提要 C++实现代码 内容提要 随机整数生成器 C++实现代码 #include "itkMersenneTwisterRando ...

  9. 随机地址生成器_随机连接神经网络性能超过人工设计!何恺明等人发布新研究...

    选自arxiv 作者:Saining Xie.Alexander Kirillov.Ross Girshick.Kaiming He 机器之心编译 随机连接的神经网络性能居然比人工设计的网络(ResN ...

最新文章

  1. linux中链表的使用【转】
  2. 深入理解c#(第三版)(文摘)
  3. linux 指令tftp传输文件_Linux tftp命令使用详解:在本机与tftp服务器之间使用TFTP协议传输文件...
  4. oracle关联表查询使用索引_SQL技巧:查询某个表关联的所有存储过程
  5. 初探Object in java
  6. linux系统给串口权限,让ubuntu串口和USB设备不用root权限访问
  7. 使用Enide Studio 2014 IDE进行Express JS路由
  8. Python零基础学习系列之三--Python编辑器选择
  9. 6月9日 基于激光雷达的SLAM算法对比分析
  10. 数据--第32课 -二叉树的定义
  11. Cinema 4D R25 for mac(c4d r25)快捷键分享
  12. 微信UnionID作用
  13. 介绍一种养眼的IDEA/Pycharm/Clion配色方案
  14. java long 多少位_long long 可以支持多少位的数?
  15. 记录 网上搜集的自动获取银行卡信息工具类
  16. 解决element 表单验证不通过的俩大坑
  17. springboot配置两个parent的方法
  18. word中添加背景色
  19. 区块链需要学习哪些东西_区块链入门需要学哪些知识?
  20. Go语言相关书籍推荐(从入门到放弃)

热门文章

  1. dst发育筛查有意义吗_儿童视力筛查,都筛些啥?
  2. xcode w情ndows版,xcode Windows版安装使用介绍
  3. bash shell sed 获取第一行_老司机给出的关于 shell 脚本的8个建议,必收!
  4. 如何设置MySQL的环境变量
  5. icd植入是大手术吗_骨折手术植入了钢板,骨折痊愈后,需要取出钢板吗?
  6. python实例 71,72
  7. 没有bug队——加贝——Python 练习实例 11,12
  8. mysql数据库多少张表会影响性能_mysql数据库多少张表会影响性能
  9. mongodb java数组_MongoDB 基础java数据类型
  10. android progressbar 水平动画,Android ProgressBar 自定义样式(三),动画模式