一、脚本的运行顺序及生命周期
#region Unity回调脚本的生命周期
void Awake ()
{
//拿到外面的引用(挂载,游戏对象),只走一次.
print ("Awake");
}
void OnEnable ()
{//一旦激活就会走一次,计数器会重置.跟下面的OnDisable对应.
print ("OnEnable");
}
// Use this for initialization
void Start ()
{
//初始化游戏对象[就是一加载进来后想要的效果,跟OnDestroy对应]
print ("Srart");
}
void FixedUpdate ()
{ //固定频率执行调用,Unity中默认是0.02秒每次,可以修改.
//Unity的顶部菜单Editor ->Project Setting-> Time->TimeManage->FixedTimeStep
//人眼可接受的视频流畅频率是1s 60帧,低于这个就会感觉卡顿.
//比如说发射出去的子弹应该匀速的出去
print ("FixedUpdate");
}
void Update ()
{ //每一帧都会执行,频率不定,要根据硬件和系统来说
print ("Update");
}
void LateUpdate ()
{ //在Update之后都会执行调用
//比如说:摄像机的跟随一般写在LateUpdate
//避免跟随角色时造成不必要的卡顿
print ("LateUpdate");
}
void OnGUI ()
{ //老版的UI事件,每一帧都会调用,处理GUI相关的.一帧调用两次,随系统.
print ("OnGUI");
}
void OnDisable ()
{ //OnEnable对应,只要取消激活就会走
print ("OnDisable");
}
void OnDestroy ()
{ //只要销毁对象就会执行一次.
//爆出来装备,Price奖励的逻辑就写这里.
print ("OnDestroy");
}
#endregion
二、如何同过挂载在组件A上的脚本获得组件
首先创建一个Transform类型的变量。
C#
public class SunAroundFather : MonoBehaviour
{
private Transform m_Sun;
public bool isPublicRotate = false;
在Awake里边进行赋值,可用方法有:
void Awake ()
{
m_Sun = GameObject.Find ("Sun").transform;//通过查找对象名字
m_Sun = GameObject.FindWithTag ("Player").transform;//找所有标签(效率略低)
m_Sun1 = GameObject.FindGameObjectsWithTag ();//找标签s,未完全理解,但是不能【点】出transform。
m_Sun1 = GameObject.FindGameObjectWithTag ();//找标签,且只找最后一个,效率高,未完全理解,但是不能【点】出transform。
}
PS: 还有一个 transform.find() //这个是查找该对象的子对象。(了解,不常用)。
三、GameObject
理解:相当于在C#语言基础中,类的实例化对象,代表该对象,可点出方法,也可用来Public GameObject 的公共属性。
用法:
可用来获得自身/或者其他对象身上的组件和属性:
gameObject.GetComponent<T> ();
tag //可读写属性,标签
name; //名字
SetActive (); //设置游戏物体是否是活动的
四、Transform类
属性:
position //世界坐标系中的transform
localPosition //相对于父物体的位置
eulerAngles //欧拉角,旋转的角度
rotation // 把对象旋转至 (四元数类型,可转换换为V3)
root //获得该组件的最顶层对象的transform
parent //对象的父物体的transform组件.
/*设置的父物体的两种方法:
1.通过属性赋值: A.transform.parent = B;
2.通过方法传参设置: A.transform.SetParent(B);
*/
方法:
transform.Translate (Vector3.up); //按给定参数的方向移动
transform.Rotate (Vector3.up);//按给定的轴和角度旋转
transform.RotateAround (point,axis:,angle);//绕point点沿axis旋转angle(类似地球绕太阳公转)
transform.Find ();
transform.LookAt (); //使物体朝向一个目标或一个点
因为transform是每个游戏对象都必须有的属性(组件),包括空物体,所以类似的可以代替gameObject点出一些方法,但用法可能稍有不同,难点在于区分 transform和gameObject的区别,特别是在查找目标的时候(Find),混淆会出错.
dasds
五、Time (静态工具类)
Time.time;//游戏开始时长(从0计时,只读)
Time.deltaTime;//获取上一次Update()方法执行的时间到背刺执行Update()方法时间的插值(一般用于减速,默认0.02,会被时间缩放:timeScale影响)
Time.fixedDeltaTime;//在物理和其他固定帧速率进行更新上一帧所消耗的时间,以秒计算.
Time.timeScale;//时间缩放(正常/默认为1),需放在Update,影响FixedUpdate里的事件和所有与deltatime有关的量.
System.DateTime.Now;//获取系统时间
六、Vector3(三维向量)类
属性:
transform.position.normalized;//标准化向量,方向不变(复制原向量方向,长度为1)
transform.position.magnitude;//向量长度(只读)
transform.position.sqrMagnitude;//向量长度平方(只读)
Vector3.forward;//(0,0,1)
Vector3.up;//(0,1,0)
Vector3.right;//(1,0,0)
方法:
Vector3.Normalize();//标准化向量,长度为1(在原向量上取长度为一的向量单位)
Vector3.Lerp();//两个向量之间的线性插值
Vector3.Angle ();//两个向量之间的夹角
Vector3.Distance ();//两向量之间的距离(可用来限制Lerp的追随距离)
Lerp:在许多类里边都存在,参数形式为( T起点A,T终点B, T t )
线性插值,"t"为参数,
计算公式为:A+(B-A)*t;
线性插值算出来的是一个定值,如果用它来过度,不论是V3,Color,还是Mathf,需要把Lerp放在Update里边,
并且三个参数中至少保证有一个是变量,才可达到过度,渐变的效果;
这里提出一个想法,有时候只是单单的匀速变化,是无需运用Lerp的,
我们可以在场景里边创建一个GameObject(空物体),使它自转(transform.rotate(v3.up)),这时候GameObj的Rotation(一个四元数)的Y轴数值的变化规律为 0->1->-1
如果ABS取绝对值,则为 0->1->0,可完美控制数值增大减小,也可直接把此值配合Lerp使用,当作参数t,使之为变量.
七、Quaternion (四元数)
Quaternion.identity;//该四元数无旋转,常用在代码创建对象(实例化);
Quaternion.LookRotation ();//效果就是模仿另一个目标的除在Z轴上的所有动作;
八、预设体
Instantiate (预设体,位置,旋转(常用 Quaternion rotation));
如果需要GameObject变量接收,需使用里氏转换 Instantiate()的返回值为Object,需要as GameObject.
九、人机交互
Inpute类
Input.GetKey ();//键盘某键被按住
Input.GetKeyDown ();//键盘某键被按住
Input.GetKeyUp ();//键盘某键被弹起
Input.GetButton ();//某虚拟按键被按住
Input.GetButtonDown ();//某虚拟按键被按下
Input.GetButtonUp ();//某虚拟按键被弹起
Input.GetMouseButton ();//鼠标某键被按住(0左,1右,2中)
Input.GetMouseButtonDown ();//按下
Input.GetMouseButtonUp ();//弹起