使用Unity编写传统ARPG游戏人物操作方式(二)

本文介绍了使用Unity开发ARPG游戏中3种不同的人物操作方式:经典3D开放角度操作(如《最终幻想零式》)、经典3D无锁定视角操作(如自创游戏)和经典3D固定面向方向操作(如《龙之谷》)。通过键盘和鼠标控制,结合CharacterController和Animator系统,详细讲解了每种操作方式的实现原理与代码示例。
摘要由CSDN通过智能技术生成

在上一篇博客中已经介绍过了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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值