Input.GetAxis("Horizontal")
Input.GetAxis("Vertical")
(1)对Input.GetAxis中的Horizontal、Vertical的理解:
先看一个图:
我们平时所说的Horizontal 这个水平轴其实就是X轴,也就是键盘上的AD键或是左右箭头,可以想象一下当你按下AD键时,物体就在X轴方向水平移动;而我们所说的Vertical 这个轴,其实是图中的Z轴,而不是图中的Y轴,当我们按下键盘上的WS键也就是前进后退键,其实物体是在Z轴进行移动。而图中的Y轴,才是真正的垂直轴,可以在Y轴上加入一个值,用来充当一个物体的重力分量。
(2)GetAxis()的作用:获取鼠标或者键盘消息
参数:
- 触屏类
参数 | 触发要求 |
---|---|
Mouse X | 鼠标沿着屏幕X移动时触发 |
Mouse Y | 鼠标沿着屏幕Y移动时触发 |
Mouse ScrollWheel | 当鼠标滚动轮滚动时触发 |
- 键盘操作类
参数 | 触发要求 |
---|---|
Vertical | 对应键盘上面的上下箭头,当按下上或下箭头时触发 |
Horizontal | 对应键盘上面的左右箭头,当按下左或右箭头时触发 |
Time.deltaTime * moveSpeed
上面的位移量通过movespeed * Time.deltaTime方式获取。
理解:
比如定义的movespeed = 1,,意思是角色速度为1米/秒,
那么如果moveh += movespeed ,就默认了经过了1秒的时间水平方向移动了1米。
这个时候请注意,这个函数是多长时间调用一次呢?答案是:1帧,而不是1秒,
那么一帧有多久呢?也就几十毫秒吧,准确的时间就是Time.deltaTime(它表示距上一次调用Update或FixedUpdate 所用的时间)。所以说用movespeed * Time.deltaTime,就是这么几十毫秒,应该移动的距离。
this.transform.Translate (h, v, 0)
Input.GetButtonUp ("Fire1")
GetButtonUp:在指定按钮被松开时立刻触发指定event.
注意,按钮名称需要自行输入,必须严格与Input面板中的名称对应,请注意大小写规范以及是否空格。
按钮(Button)的概念在Unity3D中比较特殊。并不一定专指鼠标按键、键盘或者手柄,而是通过预先的定义可以囊括一系列不同的按键,以方便使用。
从菜单Edit > Project Settings > Input可以打开Input面板:
这里指定了18个不同的Axes,可以理解为“轴向值”。Name是这个轴向的名称,Positive Button和Alt Positive Button中所指定的按键被按下时,该轴向的值迅速增长到1,Negative Button和Alt Negative Button中所指定的按键被按下时,该轴向的值迅速减少为-1,无任何按键被按下时,轴向值迅速归0。
而Button就是指的轴向中所规定的所有按键。比如这个叫做Horizontal的轴向,我们可以理解为“横向输入按钮”,当键盘left、right键或a、d键被按下时,就相当于“横向输入按钮”被按下了。
我们经常会使用到的Button有:
使用Horizontal、Vertical来设置运动方向或旋转方向
使用Fire1来控制攻击行为
使用Jump来控制跳跃
使用Cancel来取消或者呼出游戏菜单
…
我们还可以自己增加更多的Axes。
Instantiate (bullet,
this.transform.position,
this.transform.rotation) as Rigidbody
Instantiate函数是unity3d中进行实例化的函数,也就是对一个对象进行复制操作的函数,这个函数共有五个重载(overloaded)函数,对这五个函数的理解不清楚的话产生的效果也不相同,现在对这五个函数做一定的理解。
先附上unity3d API 中对这个函数的描述:
Instantiate函数实例化是将original对象的所有子物体和子组件完全复制,成为一个新的对象。这个新的对象拥有与源对象完全一样的东西,包括坐标值等。
original:用来做复制操作的对像物体,源对象;
position:实例化的对象的位置坐标;
rotation:实例化的对象的旋转坐标(旋转四元数);
parent:实例化对象的父对象,就是给这个实例化对象找的爹,在完成实例化函数处理后,实例化对象将在父对象下,是父对象的子对象;
instantiateWorldSpace(老的叫WorldSpaceStays):这个值为TRUE,表示实例化对象相对于世界坐标系的位置(是位置,不是坐标值,比如实例化前在Canvas左上角,实例化后还在左上角)不变,相对于父对象的坐标值变了。为false,表示实例化对象相对于父对象的坐标值不变,但在世界坐标系中的位置变了。
this.transform.TransformDirection (Vector3.forward)
public Vector3 TransformDirection(Vector3 direction);
public Vector3 TransformDirection(float x, float y, float z);
从自身坐标到世界坐标变换方向(这个强调的是方向)这个操作不会受到变换的缩放和位置的影响。
instance.AddForce (forward * power)
unity3D中通过 rigidbody.AddForce(x,y,z)方法添加力的作用,该方法的参数是施加力的方向,参数大小代表了力的大小。
Rigidbody.velocity
这个方法是瞬间给物体一个恒定的速度,将物体提升至该速度。
Rigidbody.addForce
这个方法瞬间给物体一个规定好的力
这两者有什么不同呢?
举个例子大家就明白了:
假设我们想要做一个2D的跳跃游戏,在这个游戏里我希望我按下跳跃键的时候,游戏物体的跳跃高度是恒定的。那么,如果此时我使用的是addForce显然不会满足我的效 果,因为经过测试,
每按一下跳跃键,它会被施加一个恒定的力,它跳跃的初始速度会越变越大,
每次跳跃的高度和前一次相较变得越来越大(在连续跳跃的情况下),也就是可以理解成,我现在被施加了一个
大小为50的力,在重力作用下我的力的效果在减小,在正向速度还没有完全消失的情况下,此时我又按了一下跳跃键,那么就会在这个力的基础上再施加一次大小为50的力,物体会越跳越快,越跳越高。
而此时如果我们使用的是velocity方法改变它的初始速度到我们希望的值和方向,那么当我们按下跳跃键的时候,无论此时物体减速到何种情况,也最多只会提升到我们规定的速度以及朝向我们规定的方向。
初始速度不变的情况下,跳跃高度也是恒定的。
这就是他们两个的区别,一个是持续施加,一个是有限施加。
具体的游戏例子来自“涂鸦跳跃”,感兴趣的朋友可以尝试下,它使用的就是velocity方法:
Destroy (this.gameObject, 3f)
Destroy ()是主要用于销毁游戏对象以及组件,但不会再引用那个被销毁的对象。
格式:
①Destroy (GameObject);
②Destroy (GameObject,time);
说明:
(1)GameObject 是销毁的游戏对象,也可以是Prefab预制体。
(2)time 是销毁游戏对象的指定时间。