美文网首页unityunity3d
[Unity 3d] 教你使用摇杆控制CharacterCont

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

作者: 雨落随风 | 来源:发表于2019-08-17 20:16 被阅读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作用-腾讯游戏学院

    相关文章

      网友评论

        本文标题:[Unity 3d] 教你使用摇杆控制CharacterCont

        本文链接:https://www.haomeiwen.com/subject/gvicsctx.html