美文网首页
【Unity3D】常用API学习笔记

【Unity3D】常用API学习笔记

作者: 夕望有你 | 来源:发表于2016-12-29 16:10 被阅读182次

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);//

}

好了,就先介绍这些。

相关文章

网友评论

      本文标题:【Unity3D】常用API学习笔记

      本文链接:https://www.haomeiwen.com/subject/gkkpvttx.html