您的位置:首页 > 移动开发 > Unity3D

Unity3D开发总结2

2013-03-07 19:29 357 查看
1. 当mouse、key按下时,按下的动作速度、帧的更新速度、if(input.getkey(..))的速度的快慢顺序是:

if(input.getkey(..))//程序的判读速度最快,一帧内完成 > 帧的更新速度 > mouse、key按下的动作速度//所以一个按下的动作可能会跨越多帧

2.

***************scriptA***************

using UnityEngine;

using System.Collections;

public class fun : MonoBehaviour

{

// Use this for initialization

//public GameObject test;

private test test;

void Start ()

{

test test=GetComponent("test") as test ; //scriptA通过此方式,每调用一次scriptB的 test.fun()方法时,

//在scriptB中有个Updata()方法 主要用于更新fun()中的状态值(主要是和时间有关系的)

//而且只要脚本被实例化,如作为某个object的组件时,呢么该脚本中的Updata方法就一直在更新,无论是否被别的脚本调用

}

// Update is called once per frame

void Update ()

{

test.fun();

}

}

***************scriptB***************

using UnityEngine;

using System.Collections;

public class test : MonoBehaviour {

// Use this for initialization

private float mytime=0;

private float totaltime=2;

private float timelength=3;

private bool isplay=true;

private float mylengthtime=0;

void Start () {

}

// Update is called once per frame

void Update () { //update方法只要用于更新fun()方法中的状态值,如 mylengthtime

mylengthtime+=Time.deltaTime;

if(isplay)

{

isplay=fun ();

}

if(mylengthtime>timelength)

{

Destroy(this); //如果为Destroy(GameObject),那么就是销毁与该script组件相绑定的GameObject对象,

//如果为Destroy(this),那么就是销毁组件本身,组件可以看做是主GameObject的成员属性实例

}

}

public bool fun()

{

mytime+=Time.deltaTime;

if(mytime>=totaltime)

{

return false;

}

return true;

}

}

3. 一个脚本A引用另一个脚本B中的静态属性,可以直接引用,不用先获取B脚本的实例

4.

a. new vector3(myTime*0.26飞,0,0) //会得到一个归一化的vector3,结果应该是 (1,0,0)

b. 关联到脚本的prefab,只要改动prefab(包括prefab所绑定的脚本、关联的材质等),就会自动更新别处对其的引用

c. 只用rigidbody才具有 gameobject.velocity.y ...和 physical.gravity.y=-8; //这样的设置才能对其生效

d. 如果只有collision,而没有rigidbody,就只能用于检测碰撞,而没有碰撞的“动态”

e. 使用tag比name好,因为 instance物体在生成时其Name会自动更改--->如: Name(Clone),但是instance的tag不会更改

f. collider.enbled=false //关闭碰撞

g.

raycastHit hit ;

if( raycast(从什么点//世界坐标,沿着什么方向//世界坐标,out Hit,多远距离) ) //raycast用于判断是否有物体被击中

{..........}

5. 在进行游戏各种事件的处理时,要使用瞬间状态分析方法

6.

a. collider.enable --->让碰撞失效

b. IsTrigger// 是否碰撞时容许穿越

c. if(shipBullet!=null&& collider.enable) physics.ignoreCollision(shipBullet.collider,collder) //忽略shipBullet实例和本gameobject的碰撞

d.

e.

f.

g.

h.

7. startCoroutine的调用原理

void Updata ( )

{

print ("Starting " + Time.time); //A

StartCoroutine (WaitAndPrint (2.0F)); //B

print ("Before WaitAndPrint Finishes " + Time.time); //C

}

//Updata ( )执行时,A、B、C会顺序执行,B延时yield return new WaitForSeconds(waitTime);

//然后返回print ("WaitAndPrint " + Time.time);

//返回print ("WaitAndPrint " + Time.time)后,WaitAndPrint (float waitTime)方法才能再次被调用

IEnumerator WaitAndPrint (float waitTime)

{

yield return new WaitForSeconds(waitTime);

print ("WaitAndPrint " + Time.time);

}

8. gameobject、transform的this和非this区别:

a. 如果在脚本中使用脚本所绑定的主对象的 gameobject和transform实例,可以直接使用(直接写gameobject或transform,不用加任何前缀)

b. 如果在本脚本中引用其他实例(非脚本所绑定的主对象),可以使用如下方式:

function OnCollisionEnter(Collision collision)

{.......

Destroy(collision.gameobject);

}

9. Gameobect.active //控制是否可见

10.

obj.transform.Rotate(Vector3.up,speed*Time.deltaTime); //沿着自身的Vector.up方向进行旋转

obj.transform.Rotate(Vector3.up,speed*Time.deltaTime,Space.World); //沿着世界坐标的Y轴进行旋转

11.

a. transform、render、collision...都是主Object的组件,在脚本中可以直接使用transform、render、collision(前面不用使用主实例名称)来表示脚本绑定主对象的各个组件

b. AddComponent(脚本名称)-->动态创建了一个脚本实例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: