【Unity3D】常用API学习笔记

【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中调用。

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

【Unity3D】常用API学习笔记_第1张图片
Monobehaviour函数调用顺序

2、Input类:
getaxis、getkey、getbutton、getjoystick等函数。

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

4、单例模式singleton:
单例仅允许被实例一次,这就保证了他在各个程序模块间的唯一性。
private static ModelLocator instance;
public static ModelLocator getInstance{
    get{
        if(instance==null){
            instance=new ModelLocator();
        }
        return instance;
    }
}


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这些类。

static function Instantiate(original: Object, position: Vector3, rotation: Quaternion): Object;
  
public GameObject Spawn() 
{
    /* 生成prefab的实例化,因为默认是object类型,所以需要强转为GameObject */
    return GameObject.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())等待某个操作结束之后再执行代码字符串做为参数:

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

void DoSomething (float someParameter) 
{
    while (true) 
    {
        print("DoSomething Loop");
        // 停止协同程序的执行并返回到主循环直到下一帧.
        yield;
    }
}

IEnumerator做为参数:

IEnumerator Start()
{
    StartCoroutine("DoSomething", 2.0F); //StartCoroutine(DoSomething(2.0F)); 使用IEnumerator做参数不能用StopCoroutine停用。
    yield return new WaitForSeconds(1);
    StopCoroutine("DoSomething"); //请注意只有StartCoroutine使用一个字符串方法名时才能用StopCoroutine停用之。
}

IEnumerator DoSomething(float someParameter)
{
    while (true) {
        print("DoSomething Loop");
        yield return null;
    }
}


开启协同:

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延时返回,但不推荐这样做:

IEnumerator Start()
{
    StartCoroutine("DoSomething", 2.0F); //StartCoroutine(DoSomething(2.0F)); 使用IEnumerator做参数不能用StopCoroutine停用。
    yield return new WaitForSeconds(1);
    StopCoroutine("DoSomething"); //请注意只有StartCoroutine使用一个字符串方法名时才能用StopCoroutine停用之。
}

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

IEnumerator Init()
{
    yield return StartCoroutine(init1());
    Debug.Log("init1 finish");
    yield return StartCoroutine(init2());
    Debug.Log("init2 finish");
    yield return StartCoroutine(init3());
    Debug.Log("init3 finish");
}
 
IEnumerator init1()
{
    // 模拟初始化
    yield return new WaitForSeconds(2);//
}
IEnumerator init2()
{
    // do somthing..
    yield return new WaitForSeconds(2);//
}
IEnumerator init2()
{
    // do somthing..
    yield return new WaitForSeconds(2);//
}
        好了,就先介绍这些。

你可能感兴趣的:(虚拟现实技术)