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

发表于2017-06-19
评论0 2.3k浏览

Unity作为常用的开发引擎,大家有必要知道unity的一些基本概念和操作,了解每个功能、插件的用途,这样才能帮助自己更好的去做开发。

对象与资源的区别与联系

资源(asset)就是可以在我们的项目中使用的文件,包括图像、视频、脚本文件、预制文件等,它们的存在不依赖于Unity。


ProjectWindow中显示Asset

资源通过文件夹的形式来组织,资源会按照文件类型分类放到不同的文件夹。

对象(Object)是Unity创建的实例,你可以在inspector窗口中调整它们的属性。其中游戏对象(GameObject),出现在场景中的所有物体都是GameObject,GameObject按照一定的层次结构组织起来,显示在Hierarchy窗口中。


Hierarchy存放GameObject

对象通过层次结构来组织,通过整体-部分的关系构成层次结构。

Asset与Object的联系:
对象可以通过资源来保存起来,资源可以用来创建对象实例,一个资源可以创建多个对象。


MonoBehaviour

MonoBehaviour是每一个脚本对象的基类,它有一些方法可以覆盖,这些方法会在运行的特定时间被调用,我们通过在这些方法中打印一句话来看看它们的执行顺序如何:


代码.png

运行结果:


启动.png

每一帧.png

结束.png

我们验证了这张图:


MonoBehaviour

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

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


GameObject-UML.png

对象的基本操作

要控制对象和对象森林(Hierarchy)的结构,我们要创建Script并将其挂载到对象上,然后在Script中改变GameObject的Component的属性(改变了Component的属性也就改变了GameObject!)。

获取在这个对象上的部件:

1
2
3
4
5
6
void Start () {
    Rigidbody rb = GetComponent();
 
    // Add a force to the Rigidbody.
    rb.AddForce(Vector3.up * 10f);
}

创建对象:public static GameObject CreatePrimitive(PrimitiveType type);
克隆对象:Object.Instantiate()

1
2
3
4
5
6
7
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)
添加子对象:

1
2
3
4
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;

遍历对象树:

1
2
3
foreach (Transform child in transform) {
    DoSomething(child);
}

另外也可以通过Transform的方法。

清除所有子对象:

1
2
3
foreach (Transform child in transform) {
    GameObject.Destroy(child);
}

更多的方法见GameObject文档


预设与对象克隆

预设(prefab)是一个对象的快照或模板,可以用于快速生成相同的对象,比如子弹、敌人等等。修改预设以后,通过该预设生成的对象也会发生变化。

预设与克隆的联系与区别:

预设与克隆都能创建出相同的对象。预设创建出的对象与源预设依然有联系,后者的更改会影响到前者。但是克隆出的对象与源对象不再有联系。


组合模式

一个对象可以由多个对象组成,而组合出的对象依然与正常的对象没有什么不同,操作组合对象与操作单一的对象的方式没什么不同,这就是组合模式(可以理解为1+1 == 1)。
组合模式允许你将对象组合成树形结构来表现“部分-整体”的层次结构,使得对象使用者以一致的方式处理单个对象以及对象的组合。(这个好处我们将会在学习Unity(7)体会到)

另外一个好处是,实现了组合模式以后,我们就可以忽略“部分”的存在了,我们只需要告诉“整体”要做什么,然后“整体”就会让每一个“部分”做好自己的事情。
让我们从组合模式的角度来看待电脑开机。如果说电脑是一个“整体”,那其中的CPU、内存等硬件就是“部分”。当我们想要开机的时候,我们需要告诉CPU、内存要怎么启动起来吗?不用,我们只需要按开机按钮,告诉电脑这个“整体”:我要开机。然后电脑就会让CPU、内存等硬件做自己的事情,最终把电脑启动起来。

我们通过BroadcastMessage来让“整体”发送消息给“部分”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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收到消息以后执行自己的代码:

1
2
3
4
5
6
7
8
9
10
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CPUscript : MonoBehaviour {
 
    void Boot(string time) {
        print ("CPU is running. Boot time: "+ time);
    }
}

内存收到消息以后执行自己的代码:

1
2
3
4
5
6
7
8
9
10
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文档

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引