Unity 小结 2016年11月22日

一、脚本的运行顺序及生命周期


#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 ();//弹起
















  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值