- 最后登录
- 2014-10-23
- 注册时间
- 2011-7-19
- 阅读权限
- 90
- 积分
- 81303
 
- 纳金币
- -1
- 精华
- 11
|
创建基本行为代码
首先,我们不需要角色能够在空中移动或转身。因此我们必须检测角色是否在地面上,如果角色在地面上,我们运行玩家移动角色,否则,角色将下落,直到接触地面为止。
因此在Update()函数的顶部添加一个if语句:if(charController.isGrounded == ***e){}
上面的代码的含义是,当角色控制器接触到地面后,我们可以执行if中的功能"isGrounded" 是一个条件,Unity可以自动的理解,当控制器角色接触到地面后,它的值变为***e,如果没有接触到地面,则它的值为false。如果角色没有在地面上,我们需要告诉Unity将角色降落到地面上,因此需要在if后面添加一些代码,提供一些重力的影响效果。
moveDirection.y -= gravity * Time.deltaTime;上面这行代码将起到重力的作用效果,它将使角色下降,将下面的代码放置在重力代码的后面:charController.Move(moveDirection * (Time.deltaTime * walkSpeed)); 上面的这一行新代码使用Move函数来移动角色,他是Unity中的函数,用于移动对象,我们将移动方向movedirection这个vector3赋给此函数,此函数中包含了xyz位置,并根据时间值来调整下降的速度。
换句话说,我们在movedirection的方向上以每秒walkspeed的速度移动对象。
如果你保存了脚本,并通过平移工具将角色拉高一定距离,那么当你松开鼠标的时候,你会发现,你的角色会自动向下降落,指导它触碰到地面。如果你的角色穿过地形,可以将角色拉高一些,从而保证角色的脚在地面上或高于地面。如果角色仍旧会穿过地面,则需要检查你事先设置好的碰撞体(胶囊),查看它的底部是不是和角色的脚相匹配,如果它们不匹配则,此碰撞体有可能已经穿过了地面。
因为我们已经施加了重力,下面让我们添加一些代码,以便于角色能够向前行走。在此之前,我们需要检查输入的Vertical axis,然后使之控制角色向前移动。
将下面的代码添加到isGrounded的IF中。if(Input.GetAxis("Vertical") > .1){}我们使用Input。GetAxis(“name”)来读取任何vertical axis轴的输入。如果输入值大于0.1,那么就会有一个向前的输入需求。Axes具有*。*值的原因是,模拟控制器有可能有一个读取的范围(控制速度会根据操作杆按下的距离而定)。我们也可以通过它的负值来控制相反的运动。
当按下向前的按钮后,if中的语句就会执行。
接下来,在我们告诉角色向前移动之前,我们需要有一个行走/跑动的切换选项,通常,当Ctrl被按下后,角色开始跑动,否则角色会行走。如果你只有一个行走速度,你可以跳过此设置,只添加向前行走的代码。但很多游戏都至少具有2个不同的移动速度。因此,让我们创建另外一个if语句,它可以检测是否我们需要行走和跑动了。
将下面的代码放置在GetAxis("Vertical")的if 语句if(Input.GetButton("Run")){}else{}这个新的if语句使用GetButton监听Run按钮,如***n按钮按下的时候,我们可以执行角色的跑动,否则我们的角色只会行走。
因此,让我们在if中添加行走和跑动的代码。
animation.CrossFade("***n");walkSpeed = 4;上面的代码中放入到第一个if中(跑动)。第一行使用 animation.CrossFade("animation_name") 来混合需要的动画,第二行设置行走速度(4是跑动的速度)。我们将下面的代码放置在else中:animation.CrossFade("walk");walkSpeed = 1;上面的代码执行相同的功能,但混合仅行走动画,并且设置速度为1.接下来我们向添加一些代码,使之能够在前进键释放后时角色返回空闲动画。else{ animation.CrossFade("idle");}上面的代码中我们检测了向前、跑动,行走速度和空闲状态,我们现在想检测后退的运动,在if中添加下面的代码:else if(Input.GetAxis("Vertical") < -.1){ animation["walk"].speed = -1; animation.CrossFade("walk"); walkSpeed = 1;}上面的代码检测负值(控制后退),然后将动画速度设置为-1,向后移动角色,混和动画为行走,速度为1.
此时如果按下play,你能够控制角色向前、向后行走,切换行走和跑动,然而在角色真的在执行动画时,它不能真的向前和向后运动。
将下面的代码放在IsGrounded的if中,放置在最后。moveDirection = Vector3(0,0, Input.GetAxis("Vertical"));moveDirection = transform.TransformDirection(moveDirection);上面的两行代码将设置垂直运动和运动方向,以便于角色真的向前移动。
我们现在还不能进行旋转,因此需要检测水平控制,来进行旋转操作,添加下面的代码,到上面代码的前面。transform.eulerAngles.y += Input.GetAxis("Horizontal");
上面的代码设置旋转方向,点击play,现在角色可以旋转了,但你可能会发现两个瑕疵:(1)如果你执行了后退操作后,当再次执行向前操作时,角色仍旧会执行向后的动画。
If you turn on the spot without moving the character doesnt step.接下来让我们来修改这两个小bug。将下面的代码添加到行走的if中的最顶部。animation["walk"].speed = 1; 这将保证行走动画在你向前走的时候执行向前的操作。下面在IsGrounded的if中的陈述放置在设置旋转的eulerAngles前面:// Create an animation cycle for when the character is turning on the spotif(Input.GetAxis("Horizontal") && !Input.GetAxis("Vertical")){ animation.CrossFade("walk");}if语句检测如果角色在没有向前行走时,进行旋转,在旋转的时候播放行走动画。现在可以比较完美的执行动画了。
下面需要让摄像机跟踪角色了。
粘贴代码
下面是完整的代码:private var walkSpeed : float = 1.0;private var gravity = 100.0;private var moveDirection : Vector3 = Vector3.zero;private var charController : CharacterController;function Start(){ charController = GetComponent(CharacterController); animation.wrapMode = WrapMode.Loop;}function Update () { if(charController.isGrounded == ***e) { if(Input.GetAxis("Vertical") > .1) { if(Input.GetButton("Run")) { animation.CrossFade("***n"); walkSpeed = 4; } else { animation["walk"].speed = 1; animation.CrossFade("walk"); walkSpeed = 1; } } else if(Input.GetAxis("Vertical") < -.1) { animation["walk"].speed = -1; animation.CrossFade("walk"); walkSpeed = 1; } else { animation.CrossFade("idle"); } // Create an animation cycle for when the character is turning on the spot if(Input.GetAxis("Horizontal") && !Input.GetAxis("Vertical")) { animation.CrossFade("walk"); } transform.eulerAngles.y += Input.GetAxis("Horizontal"); // Calculate the movement direction (forward motion) moveDirection = Vector3(0,0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); } moveDirection.y -= gravity * Time.deltaTime; charController.Move(moveDirection * (Time.deltaTime * walkSpeed)); |
|