Unity脚本基础

Awake, Start, Update, FixedUpdate,还有一个LateUpdate

Awake在游戏启动时运行一次,并且是在脚本组件未初始化完成时工作,可以用来做一些预设置;而Start是与组件相关的,当组件的脚本完成初始化且启用了脚本组件时,工作一次,并且是在第一次执行Update之前执行。

Update是帧之间的更新,时间是不固定的,一般与物理引擎无关的更新都可以在Update里进行;

FixedUpdate是固定周期的更新,与时间管理里的FixedTime设置有关,通常与物理引擎相关的更新都在FixedUpdate里完成,而且每次FixedUpdate执行完成后会立即执行必要的物理计算。

LateUpdate应该是在一帧最后执行,也就是所有的update执行完成后执行。

Translate和Rotate

Translate是用来增量修改物体位置的,可以直接指定位移向量,也可以指定单个方向,比如transform.Translate(Vector3.forward, 10)表示向前移动10;位置除了用增量修改,也可以直接指定,如transform.localPosition = new Vector3(1,1,1);

Rotrate是用来增量修改物理朝向的,也可以使用单向,如transform.Rotate(Vector3.up, 30). 其中的数字是欧拉角,90表示直角90度。但是不能像position那样直接指定rotation,比如transform.rotation = new Vector3(1,1,1);是不可以的。

LookAt

这个方法可以实现“注视”功能,也就是朝向跟随(但是如何定义face,比如一个立方体,是它的哪个面进行朝向?这个不知道怎么设置),只需要选择一个对象,然后使用transform.LookAt(tartget),就可以实现对target的注视功能。这个可以用来设置镜头跟随或者瞄准。

Mathf.Lerp

线性插值。有时候需要在两个位置之间按一定比例选择一个点,这就叫线性插值。比如起点是1,终点是5,按0.5的比例线性插值,就会得到3,正好在1和5之间。如果每次手动计算很麻烦,尤其是涉及三维坐标点的时候。使用

Vector3 mid = Mathf.Lerp(new Vector3(1,2,3), new Vector(4,5,6), 0.5)

就可以很方便地计算中间的某个点。在计算距离光源的某个点的光线强度的时候很有用。

另外,还有一个叫SmoothDamp的方法也是类似的功能,还不清楚具体区别,有待进一步研究。

Destroy, SetActive, enabled

Destroy用来删除一个对象或者组件。如果删除的是对象,其相关的组件也会被删除。如果对象的组件是公用的,这会影响其它引用组件的对象。

SetActive用来控制一个对象是否生效。如果设置为false,对象将不活动且不可见。

enabled用来设置一个组件Component是否生效,组件是对象的子对象。

GetKey和GetButton

这两个都是用来获取按键状态的,区别在于GetKey使用的是预定义的按键名称,GetKey可以自定义按键名字。比如Input.GetKey(KeyCode.Space)表示获取空格键的状态。而GetButton可以通过在系统Edit->Project Settings->Input菜单里指定某个键特殊的名字,比如给空格键指定名字“Jump”,这样就可以通过Input.GetButton("Jump")获取状态。

两种方法都有三个状态:默认,Down, Up。教程里建议使用GetButton方法。

第一帧,当一个键被按下时,GetButton, GetButtonDown会返回true, GetButtonUp返回的则是false;

第二帧,当这个键被长按时,GetButton返回true, GetButtonDown, GetButtonUp返回false;

第三帧,当这个键抬起时,GetButton, GetButtonDown返回false, GetButtonUp返回true。

GetAxis和GetAxisRaw

这个方法应该主要用在手柄操作控制里,通过Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")来获取手柄在两个方向上的位置,返回值是float型,范围从-1到1.

这个时候,在项目设置里的input设置里,会有几个属性:Gravity, Sensitivity,Dead, Snap。Gravity控制返回值在指定方向上的归位重量,值越大,回归越快,比如将摇杆移动到最大,返回值为1时,Gavity的值越大,其返回值平滑减少到0的速度就越快;Sensitivity与Gravity刚好相反,它控制的是返回值从0增大到1或减少到-1的快慢,值越大,增加得越快;Dead用来设置一片锁定区,用来防止误触,比如摇杆摇动幅度必须超过0.1才生效,就需要把“原来的”-0.1~0.1之间设置为Dead区,这时实际上位移超过0.1时,才会返回非0值,比如无死区时返回0.05时,有死区时实际上返回0;无死区返回大于0.1时,有死区返回的才是非零值 ,但边界仍然是-1和1。 Snap的作用是如果同时按下了正负按钮时归零,比如用a和d分别表示向左移动和向右移动,但如果同时按下,保持0位不变。

GetAxisRaw与GetAxis的区别就是它的返回值并不是连续的,而是要么返回0,要么返回-1或1,即有段落,适合控制有基准方格的操作。

OnMouseDown

这个是事件函数,类似于OnMove()这种,用于鼠标与环境的交互,当对象被左键点击时,执行方法里的代码。比如可以用来开门,等。

但是关于鼠标其它按钮的定义,教程里没有介绍。

GetComponent

用于获取脚本所在对象的其它组件,比如一个UI对象,可以获得其输入框组件,从而控制文本内容。用法:

GetComponent<ComponentType>()。如果要通过一个脚本组件获取其它脚本组件,ComponentType就是其它脚本的类名称。

Time.deltaTime

这是一个很有用的数字,通常用在Update方法中。由于Update函数是按帧更新的,但是帧的时间间隔并不固定,这样就会影响对速率的计算,比如要让一个物体运动,要实现每秒前进1单位,在Update方法里只需要 + 1 * Time.deltaTime就可以了。

Instantiate

实例化一个预制件到游戏世界中。这也是一个很有用的方法,比如要扔一个手雷,就需要动态用这个方法实例化一个手雷对象,并且可以在后续代码中操纵它。使用方法示例:

GameObject obj = Instantiate(PrefabName, position, rotation)

obj.AddForce()

如果实例化的物品是一个消耗品,还需要再次使用Desctroy方法让它在效果结束后消失。

Instantiate方法经常需要设置一个public的游戏对象或者对象数组,用来告诉脚本生成什么东西。但是要注意一点,通过Inspector设置这些对象或者对象数组时,要注意设置来源是Hierarchy还是Project。如果是Hierarchy,那个这个对象会受舞台限制,如果被引用的对象本身在舞台里被Destroy了,那么将无法Instantiate,会报错,说引用对象为空。如果是从Project里引用,才可以无限Instantiate.

Invoke

这是一个延时调用,可以在引擎内置的更新帧流水里完成一些自定义的执行。

Invoke包含两个参数,第一个是必须返回void且没有参数的方法名,字符串类型,第二个参数是以秒计的延时;

InvokeRepeating与Invoke类似,但是它有三个参数,第三个参数表示在第一次引用后,每多少秒重复进行引用。

CancelInvoke用于在需要的时候,将InovkeRepeating指定的重复引用取消。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LeetJoe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值