unity3d 随机物体生成器 工具
根据输入的物体生成随机成组的物体.
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 随机物体生成器 工具相关推荐
- uniny 物体运动到一个点停止_隐藏的几何:各类随机物体中的深层联系
在"SLE曲线"结构中,随机性增加 | 来源:Jason Miller 标准几何体能够用简单规则描述,比如通过y = ax + b定义每条直线,而且各要素之间的关系也相对明了:两点 ...
- Demon_接金币(三个掉落物品预设体,一接物体的工具)
接物体的工具 using UnityEngine; using System.Collections;public class Tool : MonoBehaviour {float hor;Vect ...
- python随机数列_Python2随机数列生成器简单实例
本文实例讲述了Python2随机数列生成器.分享给大家供大家参考,具体如下: #filename:randNumber.py import random while True: try: row=in ...
- Java随机数据生成器
Java随机数据生成器 一.概述 简单易用的随机数据生成器.一般用于开发和测试阶段的数据填充.模拟.仿真研究.演示等场景. 可以集成到各种类型的java项目中使用. 二.优点 非常轻量级(不到1M), ...
- 【沐风老师】3DMAX橱柜生成器工具使用教程
3DMAX橱柜生成器工具使用教程 [生成的橱柜模型] 3DMAX橱柜生成器(Kitchen Cabinet Creator)用于在3ds Max中自动制作橱柜模型.是需要频繁设计厨房.家具和室内设计的 ...
- 【分享】AI绘画提示词生成器工具
哈喽,大家好,我是木易巷~ 今天,木易巷给大家带来AI绘画提示词生成器工具---PromptoMANIA. PromptoMANIA[AI绘画提示词生成器工具] 介绍 PromptoMANIA P ...
- js实现随机数字生成器代码
js实现随机数字生成器代码,json在线格式化代码教程如下: 输入json代码 实现结果:格式化 js实现代码如下: //parser var jsl = typeof(jsl) === 'undef ...
- ITK:Mersenne Twister随机整数生成器
ITK:Mersenne Twister随机整数生成器 内容提要 C++实现代码 内容提要 随机整数生成器 C++实现代码 #include "itkMersenneTwisterRando ...
- 随机地址生成器_随机连接神经网络性能超过人工设计!何恺明等人发布新研究...
选自arxiv 作者:Saining Xie.Alexander Kirillov.Ross Girshick.Kaiming He 机器之心编译 随机连接的神经网络性能居然比人工设计的网络(ResN ...
最新文章
- linux中链表的使用【转】
- 深入理解c#(第三版)(文摘)
- linux 指令tftp传输文件_Linux tftp命令使用详解:在本机与tftp服务器之间使用TFTP协议传输文件...
- oracle关联表查询使用索引_SQL技巧:查询某个表关联的所有存储过程
- 初探Object in java
- linux系统给串口权限,让ubuntu串口和USB设备不用root权限访问
- 使用Enide Studio 2014 IDE进行Express JS路由
- Python零基础学习系列之三--Python编辑器选择
- 6月9日 基于激光雷达的SLAM算法对比分析
- 数据--第32课 -二叉树的定义
- Cinema 4D R25 for mac(c4d r25)快捷键分享
- 微信UnionID作用
- 介绍一种养眼的IDEA/Pycharm/Clion配色方案
- java long 多少位_long long 可以支持多少位的数?
- 记录 网上搜集的自动获取银行卡信息工具类
- 解决element 表单验证不通过的俩大坑
- springboot配置两个parent的方法
- word中添加背景色
- 区块链需要学习哪些东西_区块链入门需要学哪些知识?
- Go语言相关书籍推荐(从入门到放弃)
热门文章
- dst发育筛查有意义吗_儿童视力筛查,都筛些啥?
- xcode w情ndows版,xcode Windows版安装使用介绍
- bash shell sed 获取第一行_老司机给出的关于 shell 脚本的8个建议,必收!
- 如何设置MySQL的环境变量
- icd植入是大手术吗_骨折手术植入了钢板,骨折痊愈后,需要取出钢板吗?
- python实例 71,72
- 没有bug队——加贝——Python 练习实例 11,12
- mysql数据库多少张表会影响性能_mysql数据库多少张表会影响性能
- mongodb java数组_MongoDB 基础java数据类型
- android progressbar 水平动画,Android ProgressBar 自定义样式(三),动画模式