【Unity3D】常用API学习笔记

1、MonoBehaviour类(UnityEngine命名空间中定义):

Awake:最开始调用,做一些初始化工作。建议少用,此刻物体可能还没有实例化出来,会影响程序执行顺序。

Start:不是很紧急的初始化,一般放在Start里面来做。仅在Update函数第一次被调用前调用。

Reset:用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。

Update:每一帧调用一次,帧间隔时间有可能改变。

FixedUpdate:以相同时间间隔调用,用在力学更新效果中。执行在Update之前。

LateUpdate:在Update和FixedUpdate调用之后调用。一般人物的移动放在Update中,而摄像机的跟进变化放到FixedUpdate中。确保两个独立,一前一后,不产生错误。

On开头的方法,是由其他事件触发调用的。

OnDestory:物体被删除时调用。

OnEnable:物体启用时被调用。

OnDisable:物体被禁用时调用。

OnGUI:这个函数会每帧调用好几次(每个事件一次),GUI显示函数只能在OnGUI中调用。

下图是单个脚本内部方法的调用顺序:

Monobehaviour函数调用顺序

2、Input类:

getaxis、getkey、getbutton、getjoystick等函数。

3、Time类:

常用Time.deltaTime

在Update/LateUpdate中打印Time.deltaTime时间是不固定的,是一个动态变化值,是前两帧之间时间的差值。

在FixedUpdate中打印Time.deltaTime时间是固定的。

4、单例模式singleton:

单例仅允许被实例一次,这就保证了他在各个程序模块间的唯一性。

[cpp]view plaincopy

privatestaticModelLocator instance;

publicstaticModelLocator getInstance{

get{

if(instance==null){

instance=newModelLocator();

}

returninstance;

}

}

5、GameObject类:

gameObject(g小写)代表当前脚本挂载的游戏对象本身。

GameObject(G大写)代表游戏对象类。

查找GO并赋值Find族函数:

private GameObject go;

go = GameObject.Find("Cube");//根据名字查找对象

go = GameObject.FindGameObjectWithTag(string tag);//根据标签查找

go.activeSelf 游戏物体是否被激活(true or false)

go.activeInHierarchy 游戏物体所处层级的父级是否被激活(true or false)

6、Destroy方法:

Destroy(go);

Destroy(go, 3);//等待3s销毁

销毁一个游戏物体。

7、Transform对象:

位置transform.position(注意是小写t,是monobehaviour类中的默认字段,表示当前脚本挂在的游戏物体的transform信息)

旋转transform.rotation

缩放transform.scale

向量及运算 Vector3

8、移动对象:

Transform.Translate

Transform.Rotate

插值运算:位置Vector3.Lerp 旋转Vector3.Slerp

Quaternion targetrotation = Quaternion.LookRotation(player.position - transform.position);//根据初始和目标位置计算出对应的旋转角度

9、Lerp插值运算:

插值运算不仅仅可以作为位置、旋转、缩放等计算,还可以做为灯光亮度等的差值计算,也就是说只要是从一个确定状态渐进过渡到另一个确定状态的计算,都可以用到插值运算。

位置插值:三维向量

Vector3 targetpostion = player.position + new Vector3(0, 2.42f, -2.42f);

transform.position = Vector3.Lerp(transform.position, targetpostion, speed * Time.deltaTime);

旋转插值:三维角度

Quaternion targetrotation = Quaternion.LookRotation(player.position - transform.position);

transform.rotation = Quaternion.Slerp(transform.rotation, targetrotation, speed * Time.deltaTime);

灯光亮度插值:浮点值

public float newIntensity = 5;

light.intensity = Mathf.Lerp(light.intensity, newIntensity, speed * Time.deltaTime);//light.intensity位当前灯光的值

颜色插值:

Color.Lerp(currentColor, newColor, speed * Time.deltaTime);

其他比如Material.Lerp、Mathf.InverseLerp等,可以通过查手册了解。

10、Instantiate实例化prefab对象:

所有的C#对象都是继承于object类,包括int、float这些函数类型,当然也包括Monobehaviour、GameObject这些类。

[cpp]view plaincopy

staticfunction Instantiate(original: Object, position: Vector3, rotation: Quaternion): Object;

publicGameObject Spawn()

{

/* 生成prefab的实例化,因为默认是object类型,所以需要强转为GameObject */

returnGameObject.Instantiate(prefab, transform.position, transform.rotation) as GameObject;

}

11、其他方法:GameObject.GetComponent:通过游戏物体获取其组件CharacterController cc =

this.GetComponent();Animator animator =

this.GetComponent();Component.GetComponent:通过游戏物体的组件获取其其他组件Transform

player =

GameObject.FindGameObjectWithTag(Tags.player).transform;PlayerATKAndDamage

playerAtkAndDamage =

player.GetComponent();//PlayerATKAndDamage是一个脚本AddForce:添加力AddTurque:添加扭矩

12、协同(协程):一般用来在脚本中增加延时效果。因为在Start()或者Update()中是不能直接延时的(WaitForSecond())等待某个操作结束之后再执行代码字符串做为参数:

[cpp]view plaincopy

voidStart ()

{

StartCoroutine("DoSomething", 2.0);

yield WaitForSeconds (1);//可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。这里等待1s之后才会接着执行下面的语句。

StopCoroutine("DoSomething");

}

voidDoSomething (floatsomeParameter)

{

while(true)

{

print("DoSomething Loop");

// 停止协同程序的执行并返回到主循环直到下一帧.

yield;

}

}

IEnumerator做为参数:

[cpp]view plaincopy

IEnumerator Start()

{

StartCoroutine("DoSomething", 2.0F);//StartCoroutine(DoSomething(2.0F)); 使用IEnumerator做参数不能用StopCoroutine停用。

yieldreturnnewWaitForSeconds(1);

StopCoroutine("DoSomething");//请注意只有StartCoroutine使用一个字符串方法名时才能用StopCoroutine停用之。

}

IEnumerator DoSomething(floatsomeParameter)

{

while(true) {

print("DoSomething Loop");

yieldreturnnull;

}

}

开启协同:

StartCoroutine(string methodName):字符串作为参数可以开启线程并在协程结束前终止线程;开启协程时最多只能传递一个参数,并且性能消耗会更大一点

StartCoroutine(IEnumerator routine):只能等待协程的结束而不能随时终止(除非使用StopAllCoroutines()方法)

中止协同:

StopCoroutine(string methodName):中止一个协同,只能终止该MonoBehaviour中的协同程序

StopAllCoroutines():中止所有协同,只能终止该MonoBehaviour中的协同程序

将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启。

13、yiled:和协同密切相关的一个概念,一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。

yield不可单独使用

需要与return配合使用,例如:

1 yield return 0; //等0帧

2 yield return 1; //等1帧

3 yield return WaitForSeconds(3.0); //等待3秒

4 yield return null;//立即返回调用点

所有使用yield的函数必须将返回值类型设置为IEnumerator类型,例如:

IEnumerator DoSomeThingInDelay() {...}

当然,你也可以把Start()返回值定义为IEnumerator类型,那么在Start里面也可以使用yield延时返回,但不推荐这样做:

[cpp]view plaincopy

IEnumerator Start()

{

StartCoroutine("DoSomething", 2.0F);//StartCoroutine(DoSomething(2.0F)); 使用IEnumerator做参数不能用StopCoroutine停用。

yieldreturnnewWaitForSeconds(1);

StopCoroutine("DoSomething");//请注意只有StartCoroutine使用一个字符串方法名时才能用StopCoroutine停用之。

}

你也可以把StartCoroutine和yiled return结合起来使用,保证函数执行顺序,这样调用能保证,init1,init2,init3一个一个的执行,不至于出现后面执行的代码引用一个前面未初始化的变量:

[cpp]view plaincopy

IEnumerator Init()

{

yieldreturnStartCoroutine(init1());

Debug.Log("init1 finish");

yieldreturnStartCoroutine(init2());

Debug.Log("init2 finish");

yieldreturnStartCoroutine(init3());

Debug.Log("init3 finish");

}

IEnumerator init1()

{

// 模拟初始化

yieldreturnnewWaitForSeconds(2);//

}

IEnumerator init2()

{

// do somthing..

yieldreturnnewWaitForSeconds(2);//

}

IEnumerator init2()

{

// do somthing..

yieldreturnnewWaitForSeconds(2);//

}

好了,就先介绍这些。

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

推荐阅读更多精彩内容