在上一篇博客中已经介绍过了3种ARPG游戏的人物操作方式的代码实现方法,在这篇博客里会紧接着给出另外三种操作方式,分别为:
(4) 经典3D开放角度操作方式,如日本SQUARE ENIX旗下的一款《最终幻想零式》游戏。
(5) 经典3D无锁定视角操作方式,我自己在写的一款游戏就是采用这种操作方式,这次正好用上了;
(6) 经典3D固定面向方向操作方式,如盛大旗下代理的一款韩国游戏《龙之谷》;
闲话不说,继续下一种操作方式的分析与实现方法。
(4)经典3D开放角度操作方式
提到日本SQUARE ENIX公司,几乎全世界的人应该都知道吧。嗯,这个曾开发过许多非常具有价值的游戏系列,其中包括:《最终幻想》系列游戏还有一款个人童年时期玩过的最喜欢的一款回合制RPG游戏《LIVE_A_LIVE》,可惜这款游戏并没有像《最终幻想》一样成为一个系列游戏,没玩过的同学可以尝试下载来玩一下,还是不错的。回归重点,这次要简单实现的是《最终幻想》系列中《最终幻想零式》的操作方式。由于该游戏最早是在PSP上发行的,但是我们是在Unity里面进行模拟,因此我们采用键盘的方式来实现。这种操作方式的特点是:安全脱离鼠标操作,视角转动和人物行走转向完全依赖于键盘按键的操作,并且人物行走角度也是开放的,无限制。同样采用CharacterController控件里的Move()方法进行移动的实现,3D游戏里基本都是用这个控件实现的。
同样给出简单的实现代码:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(CharacterController))]
[RequireComponent(typeof(Animator))]
public class FF_Controller : MonoBehaviour {
private CharacterController Controller;
private Animator animator;
private float V;
private float H;
private Vector3 DefaultDirection = Vector3.forward;
private Vector3 MoveDirection;
private float y;
private float CurrentSpeed;
//public Variable
public float MoveSpeed;
public float TurnSpeed;
public float RotateSpeed;
public float Gravity;
void Awake()
{
Controller = this.GetComponent<CharacterController>();
animator = this.GetComponent<Animator>();
}
// Use this for initialization
void Start ()
{
V = 0;
H = 0;
DefaultDirection = Vector3.forward;
}
// Update is called once per frame
void Update ()
{
V = Input.GetAxis("Vertical");
H = Input.GetAxis("Horizontal");
}
void FixedUpdate()
{
Move();
}
void Move()
{
if (Controller.isGrounded)
{
MoveDirection = DefaultDirection;
animator.SetFloat("V", V);
animator.SetFloat("H", H);
transform.RotateAround(transform.position, Vector3.up * H, RotateSpeed * Time.deltaTime);
JudgeSpeed();
MoveDirection = new Vector3(H, 0, V);
MoveDirection = transform.TransformDirection(MoveDirection);
MoveDirection *= CurrentSpeed;
MoveDirection = new Vector3(MoveDirection.x, 0, MoveDirection.z);
Controller.Move(MoveDirection * Time.deltaTime);
}
else
{
y = MoveDirection.y - Gravity * Time.deltaTime;
}
}
void JudgeSpeed()
{
AnimatorStateInfo AnimatorState = animator.GetCurrentAnimatorStateInfo(0);
if (AnimatorState.IsName("Walk"))
{
CurrentSpeed = MoveSpeed;
}
else if(AnimatorState.IsName("TurnRight") || AnimatorState.IsName("TurnLeft"))
{
CurrentSpeed = TurnSpeed;
}
}
}
嗯,该怎么进行解释呢?sunset在这里使用了新版的Aniamtor系统进行的动画播放,新版的Animator系统相较旧版的动画系统实现起来更为直观,简单,也更容易在动画里添加事件,简单来说,就是简易实用,建议使用。还值得一提的是,包含人物的移动的代码实现的函数最好放在FixedUpdate()里,而对键盘输入事件的监听则可以放在Update()函数里。嗯,基础的也就差不多了。哦,对了针对这种方式,由于也是通过键盘进行转视角操作的,所以Sunset也写了一份Camera的代码实现摄像机的转视角操作。接下来是Camera的代码:
/// <summary>
/// //观察目标
/// </summary>
public Transform Target;
/// <summary>
/// 限定观察距离
/// </summary>
public float Distance = 10.0F;
/// <summary>
/// The speed x.
/// </summary>
///X轴和Y轴的旋转速度
pri