unity3d gamemaker怎么用代码创建gameObject对象

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
大家好,只从接触Unity UI以来,就有所谓的 UI面板(Panel)的概念,但是苦于自己智商底下,一直都是使用控件拖拽的方式,布置好一个UI面板,然后保存为.scene文件,需要使用Application.LoadLevel(sceneName);将这个UI面板加载进来。我想问:如果在代码里面实现动态的创建面板,布局一个面板。将面板上面共有的东西抽象成一个公共面板,这样方便复用。该如何制作呢?
PS:Unity New GUI
或者 NGUI 怎么实现都可以,谢谢指导。
我用的是4.55版本的unity
所以对于UI方面一直使用NGUI的,如果 你要在代码里边创建一个新的UI,你可以用GameObject newUI=GameObject.Instantiate(UI对象).as GameO 这个UI对象包含了 你新的UI里边出现的所有元素,(比如说Label,Button之类的),可以不赋值,直接在代码里边获取这个lable或者button为其添加相关东西就好了。
新的Ugui中,直接将做好的ui保存成Prefab,Instantiate之后,注意紧接着调用transform.SetParent(canvas, false),就可以了。
谢谢,我练习一下,之前就是打算按钮的说法,将每一个UI面板制作成Prefab,然后利用GameObject.Instantiate (UI对象) as GameObject,从Resource文件夹里面动态的加载起来。但是这样的话,是不是意味着,需要将游戏里面的所有UI都打包成Prefab(如果需要网上下载的画,需要打包成AssetBundle,解压到内存后,加载)。但是这样会存在一个问题,比如面板A 和面板 B都会存在同一个Button按钮,里面的图片都一样,那么我这样打包成Prefab的话,就会存在两份一样的Button,这样的话,是不是打包这一块需要特殊处理。
要回复问题请先或
Unity developer
浏览: 2973
关注: 3 人当前位置: >
创建对象并绑定脚本
时间: 09:26 来源:Unity之家 作者:unity.jb51.net 浏览:
动态创建物体,并添加脚本脚本很简单。脚本如下:&&&&&&&&GameObject&obj&=&new&GameObject(&Mission&);&&&&
&&&&&&&&obj.AddComponent&UILabel&();&&&&
&&&&&&&&obj.GetComponent&UILabel&().text&=&&任务完成!&;&&&&
&&&&&&&&obj.transform.parent&=&GameObject.Find(&ABC&).&&&&
&&&&&&&&obj.transform.localPosition&=&new&Vector3(0,0,0);&&&&
&&&&&&&&obj.transform.localScale&=&new&Vector3(1,1,1);
(责任编辑:脚印)
免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
猜你也喜欢看这些 ??????
其他类型的Unity编程 ??????Unity3d在脚本里给游戏对象添加子对象 - 坚信移动技术可以改变我们的生活方式 - ITeye技术网站
博客分类:
void OnGUI()
if(GUILayout.Button("sphere"))
for(int i=0;i&10;i++)
GameObject obs=GameObject.CreatePrimitive(PrimitiveType.Sphere);
obs.name="sp"+i;
obs.transform.position=new Vector3(0,Random.Range(0,5),0);
obs.transform.parent=this.
obs.renderer.material=Resources.Load&Material&("Maters/Material-ball");
此脚本文件挂载在需要添加子对象的父对象的身上。
上面是效果图。。
浏览: 234106 次
来自: 北京
大神,,请问,(isChecked)是什么啊?是bboolea ...
&div class=&quote_title ...
&div class=&quote_title ...
我在设置如何格式化的时候 总是保存不了 不知道楼主有遇到过这种 ...Unity中直接使用transform和gameObject的效率测试
时间: 13:27:00
&&&& 阅读:395
&&&& 评论:
&&&& 收藏:0
标签:& & & & 尽信书不如无书,更何况是网上开发者的博客。这里也包含我自己的博客,有的时候回过头来看是有错误的地方,但是我也懒得改了,而且很多时候我们看到的文章还不一定是原始地址,而是被各个网站七转八转的,更加不可能保证准确性。
& & & & 这里测试了这么一个说法:“不要在脚本中直接使用transform或者gameObject,而应该在一开始缓存成成员变量如_transform和_gameObject来访问。因为前者每次执行的时候都要获取对应的组件,效率低。”
& & & & 这种说法不能说完全是错误的,但是经过自己的测试明白其原理后,会对这个问题以及与其类似的问题都会有更加清晰的了解。
& & & & 首先我们使用组件的时候尽量在一开始使用GetComponent缓存到成员变量里面,这个是完全合理的。但是tansform和gameObject如此常用的对象,Unity应该有更好的优化才对。否则就显得太低级了。我测试的结果也确实如此。如果不想看后面的分析,直接看结论就好了。
& & & & 结论:Unity中直接访问transform效率会比缓存成成员变量慢一点点,这个只有量级非常大的时候才会体现出来。 Unity对transform和gameObject有足够的优化处理,不要自己再模拟Unity写属性来处理,多数情况效率更差。
请看下图:
测试代码是一个简单的transform坐标赋值,循环100w次。
其中Unity属性就是直接访问transform的时间消耗,而缓存的变量就是成员变量版本的。可以看到直接缓存成员变量确实会快一些,但是100w次执行,性能差别也就10%左右。个人感觉这点差别影响不大。是直接使用unity的属性,还是缓存成员变量看个人习惯了。
注意后面两个属性进行判断和属性直接获取变量。我们有可能会“自以为是”的这么写,如果_transform为空,则获取对应组件,否则直接返回成员变量。这种情况就是最慢的“属性进行判断”,这个时候属性会执行相对复杂的逻辑,速度慢就合情合理了。而如果属性直接返回成员变量,其效率是跟直接访问成员变量一致的。
测试代码如下:
using UnityE
using System.C
public class TestTransform : MonoBehaviour {
private GameObject _
private Transform _
protected Transform SimpleTr
protected Transform Tr
if (_tr == null) {
protected GameObject SimpleGo
protected GameObject Go
if (_go == null) {
_go = gameO
void Start ()
_go = gameO
DoTestTransform();
DoTestGameObject();
public void DoTestTransform()
int count = 1000000;
transform.position = Vector3.
int time = System.Environment.TickC
for (int i = 0; i & ++i)
int index = i % 100;
transform.position = Vector3.one *
Debug.Log(&Unity属性: & + (System.Environment.TickCount - time) * 1000);
_tr.position = Vector3.
int time2 = System.Environment.TickC
for (int i = 0; i & ++i)
int index = i % 100;
_tr.position = Vector3.one *
Debug.Log(&缓存的变量: & + (System.Environment.TickCount - time2) * 1000);
Tr.position = Vector3.
int time3 = System.Environment.TickC
for (int i = 0; i & ++i)
int index = i % 100;
Tr.position = Vector3.one *
Debug.Log(&属性进行判断:& + (System.Environment.TickCount - time3) * 1000);
SimpleTr.position = Vector3.
int time4 = System.Environment.TickC
for (int i = 0; i & ++i)
int index = i % 100;
SimpleTr.position = Vector3.one *
Debug.Log(&属性直接获取变量: & + (System.Environment.TickCount - time4) * 1000);
public void DoTestGameObject()
int count = 1000000;
gameObject.transform.position = Vector3.
int time = System.Environment.TickC
for (int i = 0; i & ++i)
int index = i % 100;
gameObject.transform.position = Vector3.one *
Debug.Log(&Unity属性: & + (System.Environment.TickCount - time) * 1000);
_go.transform.position = Vector3.
int time2 = System.Environment.TickC
for (int i = 0; i & ++i)
int index = i % 100;
_go.transform.position = Vector3.one *
Debug.Log(&缓存的变量: & + (System.Environment.TickCount - time2) * 1000);
Go.transform.position = Vector3.
int time3 = System.Environment.TickC
for (int i = 0; i & ++i)
int index = i % 100;
Go.transform.position = Vector3.one *
Debug.Log(&属性进行判断:& + (System.Environment.TickCount - time3) * 1000);
SimpleGo.transform.position = Vector3.
int time4 = System.Environment.TickC
for (int i = 0; i & ++i)
int index = i % 100;
SimpleGo.transform.position = Vector3.one *
Debug.Log(&属性直接获取变量: & + (System.Environment.TickCount - time4) * 1000);
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码![Unity3D]预设Prefab与实例Instantiate的基本使用
我的图书馆
[Unity3D]预设Prefab与实例Instantiate的基本使用
简介:在Unity3D的工程建设中,Prefabs(预设)是最非常用的一种资源类型,是一种可被重复使用的游戏对象。
特点1:它可以被置入多个场景中,也可以在一个场景中多次置入。
特点2:当你在一个场景中增加一个Prefabs,你就实例化了一个Prefabs。
特点3:所有Prefabs实例都是Prefab的克隆,所以如果实在运行中生成对象会有(Clone)的标记。
特点4:只要Prefabs原型发生改变,所有的Prefabs实例都会产生变化。
Prefabs的用法:如果需要创建一些想要重复使用的东西,就该用它了。
在接下来的案例中,我们要使用预设在场景中创建小方块实例以了解Prefabs的使用。
1.搭建基础的场景:
一个地板Plain,一个下落的立方体Cube,调整摄像机的角度和位置,加个平行光源DirectionalLight。
同时给立方体加上刚体属性(Component -& Physics -& Rigidbody)。再按下键盘的E调整一下方块的角度以便落下时可以滚动一小段距离。
搭建完成的效果如图所示:
2 创建并填充预设
在Preject窗口,右击:Create-& Prefab。此时Prefab为灰色。
然后我们从Hierarchy窗口中将立方体Cube拖到Project窗口新创建的Prefab上。
此时可以看到Hierarchy中的立方体变成了蓝色,Prefabs就完成了填充。
然后你从Preject窗口中将创建的Prefabs拖入Scene窗口中,运行一下便可以看到两个一模一样的小方块。
3.在脚本中创建Prefabs实例
接着我们配合Instantiate函数,使用脚本代码创建多个Prefabs的实例。
Instantiate:可以理解成克隆原始物体并且设置位置,角度。
如果一个对象,组件,脚本实例被传入,将克隆整个对相的层次,以及所有子对象。
下面便是具体的操作过程。
首先在Project窗口点Create -& Javascript创建一个脚本
[javascript]
var&CubePrefabs&:&GameO&&
function&Update&()&&
&&&&var&instance:GameObject=Instantiate(CubePrefabs,transform.position,transform.rotation);&&
}&&var CubePrefabs : GameO
function Update ()
var instance:GameObject=Instantiate(CubePrefabs,transform.position,transform.rotation);
//Instantiate用法,注意参数
//Pre 用来克隆的Prefabs
//transform.position 脚本绑定对象的位置 就像this.transform.…
//transform.rotation 脚本绑定对象的角度 就像this.transform.…
4.写完脚本,我们要把它绑定到一个对象上。这时候,我们先删除Hierarchy窗口中的立方体。
然后创建一个空的游戏对象(GameObject-&Create Empty),放置到原来立方体的位置上。
将脚本拖放到Hierarchy窗口中的新键的空对象上,让它来执行代码。5.在Hierarchy窗口中单击空对象,在它的Inspector窗口中就能看到绑定的脚本。
然后我们把早前创建的Prefabs,也就是那个Cube,拖到脚本Pre右边的框上,完成了脚本中变量的绑定。
然后点击一下运行按钮,便会出现成千上万个小方块喷涌而出啦~
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&}

我要回帖

更多关于 unity3d game crashed 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信