提要

今天要实现的是一个简单人物控制器。

包括用w,a,s,d来控制人物上下左右跑动,鼠标左击发出连招,都是基于老的lagacy的动画。尽管unity3d自带有charactorcontroller,可是并非非常好用,所以人物控制相关的所有自己来实现。先上效果图:

场景搭建

首先下载这个package,里面包括了人物的动作还有地面的模型。

将人物和地面都拖进场景中。这里的模型默认的动画模式是lagacy,不用改动。模型有点偏小,改变模型的scale值为10.最好不要改源文件的scale的scale factor。可能会出现骨骼错位的问题。

接下来给摄像机加入一个天空盒组件,加入一个unity自带的天空盒就好。

对于人物还要加入几个component:

加入Rigdbody来控制人物,选择IsKinematic,这样角色就不会被外力影响。加了CapsuleCollider让角色 不掉下去。

HeroController用来控制角色的运动和打斗。以下会说。

角色行走

思路非常easy,通过wasd获得行走的方向,然后相应控制角色的位移就能够了,只是在变向的时候要注意角色的平滑转身。

首先定义 一个 枚举变量,为角色可能的状态。

	public enum ActionState
{
Attack_1,
Attack_2,
Attack_3_1,
Attack_3_2,
Attack_3_3,
Attack_4,
Fire,
Jump,
Run,
Idle
}
private ActionState actionState = ActionState.Idle;

Animate函数来依据角色的状态播放相应的动画

	void Animate()
{
float delayTime = -0.1f; switch (actionState) {
case ActionState.Attack_3_1:
delayTime = -0.1f;
playerAnimation.CrossFade("Attack3-1", 0.15f);
currentAnimationClip = playerAnimation["Attack3-1"].clip;
break;
case ActionState.Attack_3_2:
delayTime = -0.1f;
playerAnimation.CrossFade("Attack3-2", 0.15f);
currentAnimationClip = playerAnimation["Attack3-2"].clip;
break;
case ActionState.Attack_3_3:
delayTime = -0.1f;
playerAnimation.CrossFade("Attack3-3", 0.15f);
currentAnimationClip = playerAnimation["Attack3-3"].clip;
break;
case ActionState.Attack_4:
delayTime = -0.1f;
playerAnimation.CrossFade("Attack4", 0.15f);
currentAnimationClip = playerAnimation["Attack4"].clip;
break;
case ActionState.Idle:
playerAnimation.CrossFade("Idle", 0.35f);
currentAnimationClip = playerAnimation["Idle"].clip;
break;
case ActionState.Jump:
playerAnimation.CrossFade("Jump", 0.15f);
currentAnimationClip = playerAnimation["Jump"].clip;
break;
case ActionState.Run:
playerAnimation.CrossFade("Run", 0.15f);
currentAnimationClip = playerAnimation["Run"].clip;
break;
case ActionState.Fire:
playerAnimation.CrossFade("Fire", 0.15f);
currentAnimationClip = playerAnimation["Fire"].clip;
break;
default: break;
}
//Switch to default if an animation is almost over
if (playerAnimation[currentAnimationClip.name].time > (playerAnimation[currentAnimationClip.name].length + delayTime)){
actionState = ActionState.Idle;
currentAnimationClip = playerAnimation["Idle"].clip;
}
}

在update函数中加入相应的逻辑函数:

	// Update is called once per frame
void Update () { float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
MovementManagement (h, v);
Animate ();
}

MovementManagement函数就是依据输入处理角色行走的

	void MovementManagement(float horizontal, float vertical)
{
if(horizontal != 0f || vertical != 0f)
{
Rotating(horizontal, vertical);
actionState = ActionState.Run;
moveDirection = new Vector3(horizontal, 0.0f, vertical);
rigidbody.MovePosition(rigidbody.position + speed * moveDirection * Time.deltaTime);
}
}

平滑转身函数(參考Unity官网的toturial)

void Rotating(float horizontal, float vertival)
{
Vector3 targetDirection = new Vector3 (horizontal, 0f, vertival);
// Create a rotation based on this new vector assuming that up is the global y axis.
Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up); // Create a rotation that is an increment closer to the target rotation from the player's rotation.
Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotation, turnSmoothing * Time.deltaTime); // Change the players rotation to this new rotation.
rigidbody.MoveRotation(newRotation);
}

因为这里是简单的平地,所以处理起来比較简单。当须要控制角色在复杂的地形上行走的时候,比方山川丘陵,就须要角色在Y方变化了。这个时候仅仅须要勾选角色的rigidbody component的 use gravity。然后限制rigidbody的x。z方向的移动了,x,z方向的移动要全然靠脚本来处理。

角色连击

首先来思考一下逻辑。

角色初始值状态是Idle。此时按下攻击。发连招的第一招,假设玩家继续按的话就进入第二招,依次类推,假设中途停下的话,就还是回到Idle状态。这是最简单的单线连招的逻辑,没有考虑打断,多连等情况,代码实现例如以下:

	void AttackLogic()
{
if (Input.GetButtonDown ("Fire1"))
{
if(actionState != ActionState.Attack_3_1 && actionState != ActionState.Attack_3_2
&& actionState != ActionState.Attack_3_3&& actionState != ActionState.Attack_4)
{
Debug.Log ("Fire");
actionState = ActionState.Attack_3_1;
}
else if(actionState == ActionState.Attack_3_1 && playerAnimation[currentAnimationClip.name].time > 1.0f)
{
actionState = ActionState.Attack_3_2;
}
else if(actionState == ActionState.Attack_3_2 && playerAnimation[currentAnimationClip.name].time > 1.0f)
{
actionState = ActionState.Attack_3_3;
}
else if(actionState == ActionState.Attack_3_3 && playerAnimation[currentAnimationClip.name].time > 1.0f)
{
actionState = ActionState.Attack_4;
}
/*else if(actionState == ActionState.Attack_3 && playerAnimation[currentAnimationClip.name].time > 2.0f)
{
actionState = ActionState.Idle;
}*/ }
else if(Input.GetButtonDown ("Jump"))
{
actionState = ActionState.Jump;
}
else if(Input.GetButtonDown ("Fire2"))
{
actionState = ActionState.Fire; //if (currentSkill==null)
} }

执行一下,就能够实现最開始的那个效果了。

參考

Unity3d toturial - Stealth

Unity3D游戏开发从零单排(六) - 人物运动及攻击连击的更多相关文章

  1. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  2. Unity3D游戏开发从零单排(五) - 导入CS模型到Unity3D

    游戏动画基础 Animation组件 Animation组件是对于老的动画系统来说的. 老的动画形同相应的动画就是clip,每一个运动都是一段单独的动画,使用Play()或CrossFade(),直接 ...

  3. Unity3D游戏开发从零单排(三) - 极速创建狂拽酷炫的游戏地形

    提要 在Unity工作流程内,地形是一个必不可少的重要元素.不论是游戏或虚拟现实都会使用到各种类型的地形效果,在这个教学中我们须要了解到地形的制作基本概念与,当中对于Unity的地形操作部分须要大量的 ...

  4. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  5. [Unity3D]Unity3D游戏开发之跑酷游戏项目解说

    大家好,我是秦元培.我參加了CSDN2014博客之星的评选,欢迎大家为我投票,同一时候希望在新的一年里大家能继续支持我的博客. 大家晚上好.我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.c ...

  6. [Unity3D]Unity3D游戏开发之怪物AI

    大家好.欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei.        在上一篇文章中,我们基本上实现了一个 ...

  7. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

  8. Unity3D游戏开发之连续滚动背景

    Unity3D游戏开发之连续滚动背景 原文  http://blog.csdn.net/qinyuanpei/article/details/22983421 在诸如天天跑酷等2D游戏中,因为游戏须要 ...

  9. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

随机推荐

  1. 最小生成树之Kruskal算法和Prim算法

    依据图的深度优先遍历和广度优先遍历,能够用最少的边连接全部的顶点,并且不会形成回路. 这样的连接全部顶点并且路径唯一的树型结构称为生成树或扩展树.实际中.希望产生的生成树的全部边的权值和最小,称之为最 ...

  2. 设计模式之迪米特原则(LoD)

    迪米特原则也叫作最少知识原则,也就是:一个对象应该对其他对象有最少的了解.也就是说一个对象应该尽量的保证高内聚性,不应该对外有太多的public方法.

  3. Web前端都学点儿啥?

    Web开发如今是如日中天,热的发烫.但是Web开发相关的技术和知识却像N座大山一样,耸立在我们面前,连绵起伏,漫无边际.那么这些山头那些我们应该占领,那些我们应该绕开,很多人看着就蒙了,这不光是初学者 ...

  4. android属性动画之ValueAnimator

    楼主前段时间做一个android项目,其中一个需求是需要制作一个动画,但是之前楼主没接触过android动画,所以在网上搜了下,并且也有人推荐可以试下用属性动画,所以我就百度了下属性动画怎么用,并顺便 ...

  5. java 服务接口API限流 Rate Limit

    一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...

  6. Servlet HTTP 状态码

    HTTP 请求和 HTTP 响应消息的格式是类似的,结构如下: 初始状态行 + 回车换行符(回车+换行) 零个或多个标题行+回车换行符 一个空白行,即回车换行符 一个可选的消息主体,比如文件.查询数据 ...

  7. sscanf

    #include<stdio.h> 1.sscanf和scanf的不同是输入来源,前者是一个字符串,后者则是标准输入设备 2.sscanf的使用,以解析时间字符串为例,将字符串“2009- ...

  8. ASP.NET动态网站制作(28)-- 三层框架(2)

    前言:三层框架的第二节课,继续上次课的内容. 内容: 1.三层框架的使用目的:可以将视图层和业务逻辑层及实体层分开,可以提高代码的扩展性,安全性,可以实现程序的低耦合性. 2.GetModel方法及G ...

  9. python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)

    二.常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准 ...

  10. The Best Hacking Tools

    The Best Hacking Tools Hacking Tools : List of security tools specifically aimed toward security pro ...