学习Unity(1)基本概念和操作

来源:互联网 发布:js 鼠标轨迹 编辑:程序博客网 时间:2024/06/18 17:57

对象与资源的区别与联系

资源(asset)就是可以在我们的项目中使用的文件,包括图像、视频、脚本文件、预制文件等,它们的存在不依赖于Unity。
1493708462-1462-4888929-03b9fcea7fd5f554
ProjectWindow中显示Asset
资源通过文件夹的形式来组织,资源会按照文件类型分类放到不同的文件夹。
对象(Object)是Unity创建的实例,你可以在inspector窗口中调整它们的属性。其中游戏对象(GameObject),出现在场景中的所有物体都是GameObject,GameObject按照一定的层次结构组织起来,显示在Hierarchy窗口中。
1493708462-5092-4888929-fa9a043b3ab470c7
Hierarchy存放GameObject
对象通过层次结构来组织,通过整体-部分的关系构成层次结构。
Asset与Object的联系:对象可以通过资源来保存起来,资源可以用来创建对象实例,一个资源可以创建多个对象。

MonoBehaviour

MonoBehaviour是每一个脚本对象的基类,它有一些方法可以覆盖,这些方法会在运行的特定时间被调用,我们通过在这些方法中打印一句话来看看它们的执行顺序如何:
1493708462-1655-4888929-431fc61875dc01cb
代码.png
运行结果:
1493708462-4930-4888929-c23f2a4ba3cb1a49
启动.png
1493708462-4267-4888929-d7bd2c2ec1838fe4
每一帧.png
1493708462-4409-4888929-c406fdbb67949375
结束.png
我们验证了这张图:
1493708468-3724-4888929-5f1767bd29f7381b
MonoBehaviour

GameObject,Transform,Component 三者之间的关系

GameObject是场景中所有实体的基类,Component通过挂载到GameObject来改变它的属性(装饰模式),Transform是一种Component ,通过挂载到GameObject来控制其位置、角度、大小、层次关系。MonoBehaviour(脚本)也是一种Component,它也可以挂载到GameObject上。
1493708471-7335-4888929-ddcf523fccd6b593
GameObject-UML.png

对象的基本操作

要控制对象和对象森林(Hierarchy)的结构,我们要创建Script并将其挂载到对象上,然后在Script中改变GameObject的Component的属性(改变了Component的属性也就改变了GameObject!)。获取在这个对象上的部件:
void Start () {    Rigidbody rb = GetComponent<Rigidbody>();    // Add a force to the Rigidbody.    rb.AddForce(Vector3.up * 10f);}
创建对象:public static GameObject CreatePrimitive(PrimitiveType type);克隆对象:Object.Instantiate()
public GameObject enemy;void Start() {    for (int i = 0; i < 5; i++) {        Instantiate(enemy);    }}
查找对象:public static GameObject Find(string name);
要获取其他GameObject,也可以通过在脚本中创建一个public变量:
public GameObject prefab;
然后将你要获取的GameObject从Hierarchy窗口(或Project窗口)拖动到Inspector窗口的对应空位,然后你就可以在脚本中使用playerTransform了。
通过标签查找单个对象:public static GameObject FindWithTag(string tag)通过标签查找多个对象:public static GameObject[] FindGameObjectsWithTag(string tag)添加子对象:
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);cube.name = "a cube";cube.transform.position=new Vector3(0,Random.Range(0,5),0);cube.transform.parent=this.transform;
遍历对象树:
foreach (Transform child in transform) {    DoSomething(child);}
另外也可以通过Transform的方法。
清除所有子对象:
foreach (Transform child in transform) {    GameObject.Destroy(child);}
更多的方法见GameObject文档

预设与对象克隆

预设(prefab)是一个对象的快照或模板,可以用于快速生成相同的对象,比如子弹、敌人等等。修改预设以后,通过该预设生成的对象也会发生变化。
预设与克隆的联系与区别:
预设与克隆都能创建出相同的对象。预设创建出的对象与源预设依然有联系,后者的更改会影响到前者。但是克隆出的对象与源对象不再有联系。

组合模式

一个对象可以由多个对象组成,而组合出的对象依然与正常的对象没有什么不同,操作组合对象与操作单一的对象的方式没什么不同,这就是组合模式(可以理解为1+1 == 1)。组合模式允许你将对象组合成树形结构来表现“部分-整体”的层次结构,使得对象使用者以一致的方式处理单个对象以及对象的组合。(这个好处我们将会在学习Unity(7)体会到)另外一个好处是,实现了组合模式以后,我们就可以忽略“部分”的存在了,我们只需要告诉“整体”要做什么,然后“整体”就会让每一个“部分”做好自己的事情。让我们从组合模式的角度来看待电脑开机。如果说电脑是一个“整体”,那其中的CPU、内存等硬件就是“部分”。当我们想要开机的时候,我们需要告诉CPU、内存要怎么启动起来吗?不用,我们只需要按开机按钮,告诉电脑这个“整体”:我要开机。然后电脑就会让CPU、内存等硬件做自己的事情,最终把电脑启动起来。我们通过BroadcastMessage来让“整体”发送消息给“部分”:
using System.Collections;using System.Collections.Generic;using UnityEngine;using System;public class ComputerScript : MonoBehaviour {    // Use this for initialization    void Start () {        PushPowerButton();    }    void PushPowerButton() {        print ("PowerButton of computer is pushed at "+time);        gameObject.BroadcastMessage("Boot", System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));     }}
System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")返回当前时间的string,这个它会作为以下每一个Boot的参数。
CPU收到消息以后执行自己的代码:
using System.Collections;using System.Collections.Generic;using UnityEngine;public class CPUscript : MonoBehaviour {    void Boot(string time) {        print ("CPU is running. Boot time: "+ time);    }}
内存收到消息以后执行自己的代码:
using System.Collections;using System.Collections.Generic;using UnityEngine;public class MemoryScript : MonoBehaviour {    void Boot(string time) {        print ("Memory is running. Boot time: "+ time);    }}

详细内容请参考官方教程和官方API文档

查看原文:http://www.51xyyx.com/3138.html
0 0
原创粉丝点击