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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

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