unityunity3d

[Unity 3d] 教你使用摇杆控制CharacterCont

2019-08-17  本文已影响0人  雨落随风

在本文,笔者将使用我们前面文章里写的那个虚拟摇杆控制 CharacterController 以2种方式移动。一个类似王者的角色控制,而另一个则类似吃鸡的角色控制。

前言

本来 Transform.Translate 用的好好的,开开心心。结果老板说漫游模式下不能穿墙,得嘞,那就整呗,不就是个控制 CharacterController,给你 2 套方案还行啊?

↓ 以下示例代码为老板口中的问题代码 ↓

using UnityEngine;
using zFrame.UI;
public class Mover : MonoBehaviour
{
    [SerializeField] Joystick joystick;
    public float speed = 5;
    void Start()
    {
        joystick.OnValueChanged.AddListener(v =>
        {
            if (v.magnitude != 0)
            {
                transform.Translate(v.x * speed*Time.deltaTime, 0, v.y * speed*Time.deltaTime, Space.World);
                transform.rotation = Quaternion.LookRotation(new Vector3(v.x, 0, v.y));
            }
        });
    }
}

方案1. 像王者荣耀那样的角色移动

其实也就是只用一个虚拟摇杆搞定 Character Controller 的移动+旋转了。

    [SerializeField] Joystick joystick;
    public float speed = 5;
    CharacterController controller;
    void Start()
    {
        controller = GetComponent<CharacterController>();
        joystick.OnValueChanged.AddListener(v =>
        {
            if (v.magnitude != 0)
            {
                Vector3 direction = new Vector3(v.x, 0, v.y);
                controller.Move(direction * speed * Time.deltaTime); //利用 CharacterController 驱动Transform
                transform.rotation = Quaternion.LookRotation(new Vector3(v.x, 0, v.y));  //这一句控制旋转,依旧不变
            }
        });
    }

方案2. 像吃鸡游戏那样的角色移动

其实呢,也就是一个摇杆控制 Character Controller 移动,用另一个摇杆控制 旋转了。

    void Start()
    {
        controller = GetComponent<CharacterController>();
        joystick.OnValueChanged.AddListener(v =>
        {
            if (v.magnitude != 0)
            {
                Vector3 direction = transform.TransformDirection(new Vector3(v.x, 0, v.y)); //这是关键语句,是不是不同于 上面代码段中的 direction 获取方式?
                controller.Move(direction * speed * Time.deltaTime);
            }
        });
        joystick2.OnValueChanged.AddListener(v =>
        {
            if (v.magnitude != 0)
            {
                transform.rotation = Quaternion.LookRotation(new Vector3(v.x, 0, v.y));
            }
        });
    }

Tips:

  1. Transform.TransformDirection - 将本地坐标系中的朝向转为世界坐标系中的朝向。
  2. 笔者使用了第二个 摇杆来控制转向,只是为了演示哈,其实真实的情况是整个右半边屏幕都可以控制转向的,也就是只要是发生在右边的 Touch 如果 TouchPhase.Began 没打到UI,那么在这个 Touch 的 TouchPhase.Moved 的时候就可以把 deltaPosition 取出来写到 Quaternion.LookRotation(new Vector3(v.x, 0, v.y));里面就好啦~

演示

这个应该就是王者的角色控制效果了,看看墙上蹭痒痒,再看看我的蛇皮走位,那就是一个字 :S-A-O。


Joystick

下面演示的类似于 吃鸡的角色移动,特点就是摇杆只控制位移,当然也顺带测试了一下被墙体堵住的感觉哈。


扩展阅读:

  1. Bian-Sh/UniJoystick - 示例在这里,当然这个仓库也出现在了下面的文章中 ↓
  2. [Unity 3d] 使用UGUI做一个类似王者荣耀的摇杆 - 简书
  3. 【Unity】 Transform.TransformDirection作用-腾讯游戏学院
上一篇下一篇

猜你喜欢

热点阅读