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

对象与资源的区别与联系

资源(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!)。

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

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文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,949评论 18 139
  • 111. [动画系统]如何将其他类型的动画转换成关键帧动画? 动画->点缓存->关键帧 112. [动画]Unit...
    胤醚貔貅阅读 13,203评论 3 89
  • 1 场景问题# 1.1 商品类别树## 考虑这样一个实际的应用:管理商品类别树。 在实现跟商品有关的应用系统的时候...
    七寸知架构阅读 6,073评论 10 59
  • 小时候生活在农村,见过各种各样的草,如:薰衣草,含羞草,狗尾巴草,车前草,有名字的,没名字的,可谓种类繁多。然而,...
    左同超阅读 5,495评论 0 1
  • 文/涟漪 本文为职场充电宝创始人阿何微课"零基础入门公众号运营与推广"的听课笔记。对于公众号运营小白还是蛮有用的。...
    涟漪成长记阅读 903评论 3 11