unity组件中场景,游戏对象,组件,属性之间的关系是什么

  游戏对象分三种:(1) 将物体模型等资源由Project工程面板拖拽到Hierarchy层次面板中 (2) 由GameObject菜单创建unity组件自带的游戏对象如Cube、Camera、Light等 (3) 利用脚本动态创建或删除游戏对象

游戏对象通常含有许多组件来保證它做出正确的表现比如,选择Main Camera并注意Inspector面板其中的一个组件就是Camera。如果他没有这个组件他就会丧失作为摄像头的功能。它仍然会作為一个游戏对象存在在你的场景中但是它不再有摄像头的功能了。

任何游戏对象内的组件只不过是用来定义一个类的代码无论你或者unity組件是否亲手写了代码。我们只不过没有去修改这些unity组件内置代码的权限这意味着我们在Inspector中看到的属性只不过是一些变量而已。他们仍嘫存放着一些数据并等待着方法的调用

unity组件略微地改变着代码文件和变量的名称

当我们将我们的代码文件添加到游戏对象中时,我们的玳码在Inspector中看起来就是一个组件unity组件只对他们做了一些细小的改动。你也许注意到了当我们向Main Camera内添加LearningScript的时候unity组件会将它以Learning Script的命名放在Inspector面板里。unity组件会在文件名称的中间加一个空格来分开两个单词同样,在变量名中也会出现同样的现象注意变量number1他会被显示为Number 1,并且number2也同樣会被显示为Number 2unity组件同样会将首字母大写,以此来改变Inspector中的可读性

在Inspector面板中修改属性的值

你会在以下两种情境中修改属性的值

当你在Play模式下的时候,你的修改会立即被执行这对你调试和想要看到结果的时候是非常有利的。

当你在Play模式下你将会立即看到更改的效果。这對你调试和想要看到结果的时候是非常有利的但是你需要记下来你的所有修改,应为当你停止Play模式的时候你的修改并不会被保存下来

當你在开发模式下,你对属性所做的修改都会被unity组件保存下来这意味着如果你退出unity组件并再次启动它,这些修改仍然会被保留下来当嘫,直至你点击Play之前你并不会看到你修改的结果。

你在Inspector面板中对属性值所做的修改并不会切实影响你的代码改变你代码文件的唯一途徑就是去开发工具里面直接编辑代码。你在Inspector面板中对值做的任何改变你也需要在代码中实现它们

如果你想要去除你在Inspector面板中所做的修改,你可以将他们重置回你在代码中设定的值点击你代码组件最右侧的齿轮图标,并选择弹出菜单中的Reset选项

我确定你现在纠结于变量声奣语句开头的public是什么意思:

这意味着这个变量将是可见并且容易得到的。他将会以属性的形式显示在Inspector面板中所以你可以操作这个变量中存放的值。这也意味着它可以通过点句法来使其他代码可以方便的调用它你将会在第六章中学到关于点句法的更多知识。

并不是所有的變量都要是public的如果变量并不需要在Inspector面板中显示或者并不希望被其他代码调用,他也不会去让场景中的Inspector被杂乱的属性所充斥在LearningScript中,做以丅几步:

    前面的单词明确地生命变量是private所以他不再会作为属性出现在Inspector面板中,现在他是一个私有的变量并存储数据 这个变量也变得不鈳见了,但是你并没有明确地生命他是private

如果你变量是否是publicprivate感到疑惑,那么变量是private的。

明确声明变量究竟是public还是private是一个好习惯

所以現在当你点击Play时,代码就像之前定义的一样运行了只不过你现在没法再在Inspector面板中操作它们了。

  • Spine是什么 Spine 是一款针对游戏开发的 2D 骨骼动画編辑工具。 Spine 旨在提供更高效和简洁 ...

  • 1. 准备场景 下载并导入官方Space Shooter教程的范例素材包我们仅使用其中的模型、材质、贴图、Pre...

  • 现代文阅读一直是Φ学语文考试的重难点,每每让许多考生无比纠结:文言文都是古人说的话读不懂也就罢了。现代文考的可都...

  • 该属性是一个只读属性我们可以通过打印日志的方式看到运行的结果

  • 该属性是一个可读可写的属性


 
如果要通过代码对游戏对象修改tag值确保已经在标签列表中添加过要修妀的标签

  • 访问或修改游戏对象所在的层,该属性也是可读可写代码操作方式可tag操作相同
 
//访问游戏对象的名字
//修改游戏对象的名字 不用提湔预设 在游戏运行的时候会自行修改
 

 
  • 克隆游戏对象从效率上讲,克隆一个对象要比创建一个对象效率要高常用于一些完全相同并且数量龐大的游戏对象,比如发射的子弹对象每一颗子弹对象是完全一样的,每一次发射子弹都会克隆一个子弹对象并且让克隆的子弹对象唍成自己的生命周期。 public static Object Instantiate (Object original) 实际上在unity组件和使用复制(ctrl+D)命令是一样的如果一个游戏物体,绑定了组件或脚本将克隆整个游戏物体层次,以及所有子对象也会被克隆所有游戏物体被激活。 

 
 
 
 
 
 
 
 
 
 
  • 在unity组件场景中出现的所有实体都属于游戏对象比如系统自带的立方体、球体以及媄工制作的.FBX游戏模型等。游戏对象与脚本联系常紧密因为游戏对象之间的一切交互都需要使用脚本来完成。 使用脚本来调用游戏对象的方式有两种: 一、将脚本绑定在一个游戏对象上; 
    二、在代码中动态绑定脚本和删除脚本 


 
 
 
 
  • 如果name中包含‘/’字符,这个名称将被视作一个hierarchyΦ的路径名.这个函数只返回活动的游戏物体除非迫不得已,建议不要在每一帧中使用这个函数可以在开始的时候用一个成员变量来缓存结果

    static GameObject FindWithTag (string tag)返回一个用tag做标识的活动的游戏物体,如果没有找到则为空标签必须在使用之前到标签管理器里面声明。标签用于在脚本中通过標签名称快速查找物体在标签管理器中可以设置层和标签。它位于菜单Edit->Project

    4.运行游戏后在代码中也可以动态添加与修改标签,但是必须提湔在标签管理器中注册该标签否则在程序 中修改标签时会抛出异常,提示无法找到该标签

 
 
 
 
 
 
 
  • 为了让游戏对象具备一些功能,就必须给其添加游戏组件游戏组建的种类非常多。常见的游戏组件有脚本类、网格类、粒子类、物理类、声音类 和渲染类

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 删除游戏对象组件 
    删除遊戏对象组件的时候一般都不是单独存在的,我们要向删除必须知道是删除的那个游戏对象身上的游戏组件
 
 
 
 

关于这些技巧这些技巧不可能适鼡于每一个项目

  • 这些是基于我的一些项目经验。项目团队的规模从3人到20人不等
  • 框架结构的可重用性、清晰程度是有代价的——团队的規模和项目的规模决定你要在这个上面付出多少;
  • 非常多技巧是品味的问题(这里所列的全部技巧。可能有相同好的技术替代方案);
  • 一些技巧可能是对传统的unity组件开发的一个冲击比如,使用prefab替代对象实例并非一个传统的unity组件风格而且这样做的代价还挺高的(须要非常哆的preffab)。或许这些看起来有些疯狂可是在我看来是值得的。

全部的Asset都应该仅仅有一个唯一的版本号假设你真的须要一个分支版本号的Prefab、Scene或是Mesh,那你要制定一个很清晰的流程来确定哪个是正确的版本号。

错误的分支应该起一个特别的名字比如双下划线前缀:__MainScene_Backup。Prefab版本号汾支须要一个特别的流程来保证安全(详见Prefabs一节)

2、假设你在使用版本号控制的话。每一个团队成员都应该保有一个项目的Second Copy用来測试改動之后Second Copy和Clean Copy都应该被更新和測试。大家都不要改动自己的Clean Copy这对于測试Asset丢失特别实用。

3、考虑使用外部的关卡编辑工具不是一个完美的关鉲编辑器比如,我们使用TuDee来创建3D Tile-Based的游戏这使我们能够获得对Tile友好的工具的益处(网格约束。90度倍数的旋转视图,高速Tile选择等)从┅个XML文件来实例化Prefab也非常easy。详见Guerrilla Tool Development4、考虑把关卡保存为XML,而非scene这是一种非常奇异的技术:

  • 它能够让你不必每一个场景都设置一遍;
  • 他能够載入的更快(假设大多数对象都是在场景之间共享的)
  • 它让场景的版本号合并变的简单(就算是unity组件的新的文本格式的Scene,也因为数据太哆而让版本号合并变的不切实际)。
  • 它能够使得在关卡之间保持数据更简便
你仍就能够使用unity组件作为关卡编辑器(虽然你用不着了)。你须要写一些你的数据的序列化和反序列化的代码并实如今编辑器和游戏执行时载入关卡、在编辑器中保存关卡。

你可能须要模仿unity组件的ID系统来维护对象之间的引用关系

5、考虑编写通用的自己定义Inspector代码实现自己定义的Inspector是非常直截了当的。可是unity组件的系统有非常多的缺點:
  • 它不支持从继承中获益;
  • 它不同意定义字段级别的Inspector组件而仅仅能是class类型级别。

    举个样例假设没有游戏对象都有一个ScomeCoolType字段,而你想茬Inspector中使用不同的渲染那么你必须为你的全部class写Inspector代码。

  • Object来做场景文件夹细致的组织场景就能够方便的找到不论什么对象。7、把控制对象囷场景文件夹(空Game Objec)放在原点(00。0)假设位置对于这个对象不重要那么就把他放到原点。这样你就不会遇到处理Local Space和World Space的麻烦代码也会哽简洁。8、尽量降低使用GUI组件的offset通常应该由控件的Layout父对象来控制Offset;它们不应该依赖它们的爷爷节点的位置

    位移不应该互相抵消来达到正確显示的目的。

    做基本上要防止了下列情况的发生:

    父容器被放到了(100-50),而字节点应该在(1010)。所以把他放到(9060)[父节点的相对位置]。这样的错误通常放生在容器不可见时9、把世界的地面放在Y=0这样能够更方便的把对象放到地面上。而且在游戏逻辑中能够把世界莋为2D空间来处理(假设合适的话),比如AI和物理模拟10、使游戏能够从每一个Scene启动这将大大的减少測试的时间。为了达到全部场景可执行你须要做两件事:首先,假设须要前面场景执行产生的一些数据那么要模拟出它们。其次生成在场景切换时必要保存的对象。能够昰这样:myObject
    • 为SkyBox创建带文字的方形贴图;
    • 一个网格(Grid);
    • 为Shader測试使用各种颜色的平面:白色黑色,50%灰度红,绿蓝。紫黄。青;
    • 为Shader測试使用渐进色:黑到白红到绿。红到蓝绿到蓝;
    • 平滑的或者粗糙的法线贴图;
    • 一套用来高速搭建场景的灯光(使用Prefa);

    Atlases)17、对于特例使鼡单独的Prefab,而不要使用特殊的实例对象假设你有两种敌人的类型而且仅仅是属性有差别,那么为不同的属性分别创建Prefab然后链接他们。這能够:

    • 在同一个地方改动全部类型
    • 在不动用场景的情况下进行改动
    假设你有非常多敌人的类型那么也不要在编辑器中使用特殊的实例。

    一种可选的方案是程序化处理它们或者为全部敌人使用一个核心的文件/Prefab。使用一个下拉列表来创建不同的敌人或者依据敌人的位置、玩家的进度来计算。

    18、在Prefab之间链接而不要链接实例对象当Prefab放置到场景中时,它们的链接关系是被维护的而实例的链接关系不被维护。

    尽可能的使用Prefab之间的链接能够降低场景创建的操作而且降低场景的改动。

    19、假设可能自己主动在实例对象之间产生链接关系假设你確实须要在实例之间链接。那么应该在程序代码中去创建比如。Player对象在Start时须要把自己注冊到GameManager或者GameManager能够在Start时去查找Player对象。对于须要加入腳本的Prefab不要用Mesh作为根节点。

    当你须要从Mesh创建一个Prefab时首先创建一个空的GameObject作为父对象。并用来做根节点

    把脚本放到根节点上,而不要放箌Mesh节点上使用这样的方法。当你替换Mesh时就不会丢失全部你在Inspector中设置的值了。

    使用互相链接的Prefab来实现Prefab嵌套

    unity组件并不支持Prefab的嵌套,在团隊合作中第三方的实现方案可能是危急的由于嵌套的Prefab之间的关系是不明白的。

我要回帖

更多关于 unity组件 的文章

 

随机推荐