角色的移动与跳跃一、概述
今天分享的是unity中的基础问题:如何控制角色的移动2d素材,跳跃。
在之前的分享中,我们使用到了其中一种官网拷贝过来的方法,并未对其做深入了解,只是简单地实现了移动,今天就来简单分享一下包含其在内的几种角色控制方法:
代码示例仓库地址:
二、使用transform控制移动
transform组件,在上次分享的电梯示例中已经说过他的重要性了,位置、旋转、缩放、父子关系都是由它来进行控制的,既然如此,我们就可以直接使用此组件进行运动控制。
1. position属性
顾名思义就是表示物体位置的一个属性,他是一个三维向量Vector3类型的,其中x,z,y便分别代表了物体的左右,前后,上下方向上的偏移量。
注意:
z代表前后,y代表上下。建模导出时这里也要注意。*
position 不支持x,z,y直接单独赋值修改,应使用Vector3变量整体修改。
如此,我们就可以很轻松地去控制物体的位置信息了。如:
Vector3 newPos = transform.position; // Vector3.zero;
newPos.x += 10;
newPos.z += 5;
newPos.y = 0;
transform.position = newPos;
此方法可通过算法模拟各种自己想要的效果,复杂但自定义程度较高。
2. Translate方法
使用transform修改位置的第二个方法就是使用他的Translate平移方法。该方法将基于当前位置信息执行相对移动。如:
transform.Translate(Vector3.forward); // 向前移动移动一个单位距离
transform.Translate(1, 0, 0); // 参数分别为x, y, z方向; 向右移动一个单位距离
另外还可以添加最后一个参数,这个参数代表了相对于谁进行移动,这里的谁:
此方法经常用来实现一些简单的移动效果,用起来比较方便。
但这两种直接修改transform的方法容易引发模型穿透的现象。
三、使用刚体进行移动
使用该方法实现移动时,如果碰到其他非触发碰撞体时,将会发生碰撞,而不是穿过,如果碰撞物体也添加了刚体组件,则将根据质量、摩擦力等物理因素实现推动效果。
对鱼刺中方式进行移动是,也同样可分为两种情况: 直接控制刚体移动速度 / 向刚体施加力的效果。
该刚体控制方法仅对非运动刚体(is kinematic 为false)且非全约束(未约束全部的位置xyz)的物体有效
开始此方法前,首先将RigidBody组件添加到被控物体上。
1. 控制刚体速度
此方法可以凭空给物体一个初速度(Vector3),其余的交给物理引擎,引擎将会利用被苹果砸了脑袋的牛顿定律(如重力、惯性)等物理法则共同作用于该物体,从而实现减速,下落等效果。代码编写为:
// 假如你已经获取到了RigidBody组件的实例rb
// 给物体一个z轴向前的初速度,物体将往前走,直到该方向速度减为零;
// 如果物体没动,可能是没来及动,就速度为0了,可适当增大数值;也不要太大,避免刹不住。
rb.velocity = new Vector3(0, 0, 1);
2. 用力推动物体
我们都学过,力是改变物体运动的状态的重要因素。所以施加力的作用肯定能达到使物体移动的目的。
// 假如你已经获取到了RigidBody组件的实例rb
// 给物体施加一个向前的力来推着物体前进,根据F=ma; 力将会产生一个加速度给到物体,以此实现加速-减速为零的整个流程。
// 如果物体没动,可能是力气太小,还没达到其最大静摩擦力,可适当增大力的强度。力太大也能体验一次超人的感觉。
// 当然,你也可以画受力分析图,达到精确控制的效果
rb.AddForce(Vector3.right);
通过刚体控制运动的方法,通过unity的物理引擎极大地模拟了现实中的很多情况,有着很好的真实效果,但有时我们并不想要那么多惯性,玩家会产生很难控制unity 角色控制器,卡顿等感觉。 当然还得是具体情况具体分析。
对于刚体控制,你可以短暂地使用代码将刚体的 is kinematic 选项打开,其可以立即停止物体的运动及物理世界对物体的影响,以此来达到刹停的效果。但要少用,耗性能。
四、使用角色控制器实现移动
官方也是体贴用户,内置了角色控制器组件,其可以简单地实现使用一个方法对物体进行控制,一个方法就包含了行走,爬楼,爬坡,跳楼等一系列可能的操作效果,就不用自己去一个个编写了。该组件中重要的两个参数:
简单设置后人物立绘,我们就可以使用Move / SimpleMove方法对角色的移动进行控制了。
这两个方法的区别就是:
虽然其作用是不相同的unity 角色控制器,使用方法是一致的,只需要一个简单的三维向量Vector3即可。
// 假定你已经获得了CharacterControl组件的实例 cc;
cc.Move(new Vector3(0, 0, 1); // 使用Move移动
cc.SimpleMove(new Vector3(0, 0, 1); // 使用SipleMove进行移动
唯一不同的是,Move方法接收的是动量,而SimpleMove接收的是速度参数(在Update中使用时不需要乘Time.deltaTime)。
武、最后
今天分享的这三种可以让角色动起来的方法,只是简单地给你提供一些可行的方案,具体使用方法还需结合实际情况来选中其中的一种或是多种的组合形式。
代码示例仓库地址:
下面是视频实现效果演示:
[Transform移动跳跃视频演示]
[RigidBody移动跳跃视频演示]
[CharacterController移动跳跃视频演示]