查看: 2206|回复: 0
打印 上一主题 下一主题

利用unity3d开发第三人称摄像机(四)

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-8-1 15:17:06 |只看该作者 |倒序浏览


创建基本行为代码
首先,我们不需要角色能够在空中移动或转身。因此我们必须检测角色是否在地面上,如果角色在地面上,我们运行玩家移动角色,否则,角色将下落,直到接触地面为止。

因此在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(&quot***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(&quot***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));
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-7-17 17:53 , Processed in 0.065042 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部