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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 大分页查询优化_Mysql骚操作:优化大分页查询

背景系统结构如上图。经过排查是因为系统B拉取数据时间太长导致的推送超时。系统B拉取数据的方法是根据_tiemstamp(数据操作时间)分页查询系统A的接口,即&#xff1a;1SELECT 字段名2FROM 表名3WHERE _timestamp > beginTime AND _timestamp < endTime 4LIMIT n, m;由于该…

python --动态类型

转自&#xff1a;http://www.cnblogs.com/vamei/archive/2012/07/10/2582795.html 动态类型(dynamic typing)是Python另一个重要的核心概念。我们之前说过&#xff0c;Python的变量(variable)不需要声明&#xff0c;而在赋值时&#xff0c;变量可以重新赋值为任意值。这些都与动…

mysql 判断等于空字符串_mysql 判断null 和 空字符串

1.在mysql中null 不能使用任何运算符与其他字段或者变量(函数、存储过程)进行运算。若使用运算数据就可能会有问题。2.对null 的判断&#xff1a;创建一个user表&#xff1a;id 主健 name 可以为空select * from user;insert into user values(33,null); ##创建一条name为空的…

JS组件系列——Bootstrap Table 表格行拖拽

JS组件系列——Bootstrap Table 表格行拖拽 原文:JS组件系列——Bootstrap Table 表格行拖拽前言&#xff1a;之前一直在研究DDD相关知识&#xff0c;好久没更新JS系列文章了。这两天做了一个简单的业务需求&#xff0c;觉得效果还可以&#xff0c;今天在这里分享给大家&#x…

Linux install innotop

innotop是mysql监控工具 1&#xff0c;下载 weget http://nchc.dl.sourceforge.net/project/innotop/innotop/1.6.0/innotop-1.6.0.zip 2&#xff0c;安装依赖包 yum install perl-DBI perl-DBD-MySQL perl-TermReadKey perl -y 3,安装innotop perl Makefile.PL make make ins…

mysql udp服务器_netty学习:UDP服务器与Spring整合(2)

上一篇文章中&#xff0c;介绍了netty实现UDP服务器的栗子。本文将会对UDP服务器与spring boot整合起来&#xff0c;并使用RedisTemplate的操作类访问Redis和使用Spring DATA JPA链接MySQL数据库&#xff0c;其中会使用多线程、异步等知识。只公布了一个框架&#xff0c;需要的…

1-4 TCP/IP协议族

网络协议是在内核中实现的&#xff0c;socket是对tcp/ip协议的系统调用&#xff0c;提供以下两点功能&#xff1a; 1. 将应用撑血数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区&#xff0c;以交付内核发送来的数据&#xff08;比如send&#xff09;&#xff0c;或者从内核TCP…

python将数据写入excel_【Python】将数据库中的数据查询出来自动写入excel文档

近期每天都要监控一个数据。第一个版本是这样的&#xff1a;每天新增一个文档来汇总这个数据。这样搞了几天之后&#xff0c;过了一个周末&#xff0c;过来突然发现数据变多了很多&#xff0c;这个时候要调整策略&#xff0c;直接一个文档汇总出要的数据就可以了。这样查了两天…

OC 继承

一、基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的&#xff0c;富二代继承了父母&#xff0c;自然就拥有了父母拥有的所有资源&#xff0c;子类继承了父类同样就拥有了父类所有的方法和属性&#xff08;成员变量&#xff09;。 在这里动物是猫类和狗类的父…

Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)

Android开发是目前最热门的移动开发技术之一&#xff0c;随着开发者的不断努力和Android社区的进步&#xff0c;Android开发技术已经日趋成熟&#xff0c;当然&#xff0c;在Android开源社区中也涌现了很多不错的开源UI项目&#xff0c;它们可以帮助Android开发者更方便快捷地完…

centos linux怎么安装mysql_CentOS-Linux系统下安装MySQL

一、mysql的安装Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软件包&…

Operating System-进程/线程内部通信-临界区(Critical Regions)

上一篇文章讲述了进程之间的竞争条件&#xff1a;多个进程同时进入一个共享区域&#xff0c;导致了数据的不一致&#xff0c;本文主要介绍如何解决这个问题。 一、临界区介绍 解决这个问题就是阻止多个进程同时进入这个共享区域&#xff0c;换句话说&#xff0c;进程之间针对这…

【html】【19】高级篇--大事件时间轴

下载:  http://sc.chinaz.com/jiaoben/131112181390.htm 其它:  http://sc.chinaz.com/tag_jiaoben/shijianzhou.html 效果:   html 代码: 1 <!DOCTYPE html>2 <html>3 <head>4 <meta http-equiv"Content-Type" content"text/html; …

必须声明标量变量_Excel VBA解读(136): 在用户定义函数中的变体、引用、数组、计算表达式、标量...

学习Excel技术&#xff0c;关注微信公众号&#xff1a;excelperfect在前面的几篇文章中&#xff0c;我们自定义的函数使用定义为Range的参数来从Excel工作表中获取数据&#xff0c;例如&#xff1a;Function VINTERPOLATEB(Lookup_Value As Variant, _Table_Array As Range, _C…

mysql内部_MySQL SQL语句内部剖析

一条SQL在MySQL体系结构内的执行流程:注意只有查询操作才会走查询缓存&#xff0c;而表的结构和数据发生改变时将会清空查询缓存。所以开启查询缓存的意义不大&#xff0c;8.0后已经废弃了该功能。一条update在存储引擎内部的执行步骤如下:SQL:update t set cc1 where id2;SQL完…

用Backbone.js创建一个联系人管理系统(四)

原文: Build a Contacts Manager Using Backbone.js: Part 4 这一系列教程的第四部分,教我们如何完成对已经存在的Contacts进行编辑和保存. 本教程是基于这一系列的前三个教程. 有不清楚的请先阅读前三部分. 开始 在Contact原模版里添加一个edit按钮. <button class"ed…

mysql默认时间怎么不同步_MYSQL 更新时间自动同步与创建时间默认值共存问题

本文作者&#xff1a;苏生米沿在使用SQL的时候&#xff0c;希望在更新数据的时候自动填充更新时间&#xff0c;那么在mysql中是如何实现的呢&#xff1f;如创建表usersCREATE TABLE RS_SIGNUPUSER (ID VARCHAR(36) COMMENT 主键(业务功能无关),USERNAME VARCHAR(50) COMMENT 姓…

python代码技巧_让你python代码更快的3个小技巧

大家好&#xff01;今天呢&#xff0c;我们来聊一聊如何加速你的 python 代码。Python 语言的优点可以列举出许多&#xff0c;语法简单易懂、模块丰富、应用广泛等等。但是世界上没有有完美的东西&#xff0c;python 一个明显缺点就是运行速度慢&#xff0c;至少跟 C 语言没法比…

从此走上一条iOS程序猿不归路。。。

新的城市&#xff0c;新的生活&#xff01;前不久刚刚结束了苦逼的面试找工作之旅&#xff0c;期间也小有收货&#xff0c;如今正处年底工作闲暇之余&#xff0c;将前一阵子陆陆续续的总结整理了一下&#xff0c;本人菜鸟程序猿一只&#xff0c;水平有限&#xff0c;本文总结的…

springboot mysql事物_在Spring Boot中使用数据库事务

关于数据库访问还有一个核心操作那就是事务的处理了&#xff0c;前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利了&#xff0c;其实不用猜&#xff0c;我们也知道Spring Boot在数据库事务处理问题上也给我们带来惊喜&#xff0c;OK&#xff0c;废话不多说&#…