unity3d虚拟摇杆_unity3d 虚拟摇杆及人物八方向 - CSDN
  • Unity3D 虚拟摇杆 Easy Touch

    千次阅读 2015-10-16 21:35:04
    教程如下:  英文官方教程链接:http://download.csdn.net/detail/hiramtan/5286699... ... 1.按照下面的指示创建一个虚拟摇杆:    添加后Unity3D游戏预览窗口如下:    然后发现面板中多了下面两项,创建一个空物体
    教程如下: 
    英文官方教程链接:http://download.csdn.net/detail/hiramtan/5286699 
    英文官方编码目录链接:http://download.csdn.net/detail/hiramtan/5286745 
    1.按照下面的指示创建一个虚拟摇杆: 
     
    添加后Unity3D游戏预览窗口如下: 
     
    然后发现面板中多了下面两项,创建一个空物体,命名为JoystickManager控制虚拟摇杆事件,如下: 
    一定要记得第二项"Joystick"物体的名字与JoystickManager.cs代码中的名字一致,下面的步骤会有提示. 
     
    查看Joystick属性面板,如下: 
     
     
    通过下面的面板,可以将虚拟摇杆更改为自己的图片资源. 


    插件下载地址:链接: http://pan.baidu.com/s/1BfCmy 密码: i442      链接: http://pan.baidu.com/s/1eQFHi86 密码: fian

    展开全文
  • 如今手机游戏玩法多种多样,尤其使用虚拟摇杆进行格斗类游戏开发或者是MMORPG成为了主流的开发方式,可能不少人都会为了制作一个完善的虚拟摇杆感到烦恼,一次又不少人选择使用插件来制作虚拟摇杆。  Momo大神在...

      如今手机游戏玩法多种多样,尤其使用虚拟摇杆进行格斗类游戏开发或者是MMORPG成为了主流的开发方式,可能不少人都会为了制作一个完善的虚拟摇杆感到烦恼,一次又不少人选择使用插件来制作虚拟摇杆。

      Momo大神在不久前才写了一篇用UGUI制作虚拟摇杆的,有兴趣的同学可以到这里看看原文,原文地址:http://www.xuanyusong.com/archives/3924

      今天刚好公司向里面需要用到这个功能,因此我也研究了一下Momo这篇文章,发现里面有一个算是bug的问题因此我就在Momo大神的代码上进行修改,修复了这个问题而且也添加一下功能方便大家去拓展和使用。

      先来看看我和我的小伙伴发现的bug吧。

      下图两张图片是Momo大神的写的UGUI虚拟摇杆的小Demo,我们来看看其效果吧:

       图片一:

       

       图片二:

       

    比较一下两张图片你会发现有一个致命问题小球的偏移量出问题了,这种情况只出现在虚拟摇杆距离屏幕边距较近的时候会出现这个问题,远离边距的时候就不会出现这个问题了,来看看远离边距时候的效果吧。如下图所示:


    这样的限制对于摇杆功能来说并不会有太大的影响,但是UI的设计上还是会出现一些问题和麻烦的。因此我今天就是为了修复这个问题而对UGUI虚拟摇杆进行了研究,花了一点时间进行了bug的修复,然后拓写了它的功能,方便我们来获取摇杆的偏移量来控制人物移动。

      先来看看我实现的效果吧,废话不多说上图!

      

      上面的图片可以看出来,虚拟摇杆已经贴着屏幕边框了,但是偏移量并没有减少。

      我也不说多少神马了因为实在是太简单了,我就直接上代码吧

    using UnityEngine;
    using System.Collections;
    using UnityEngine.EventSystems;
    using UnityEngine.UI;
     
    public class ScrollCircle :ScrollRect 
    {
        public float recoveryTime = 0.1f;
    	protected float mRadius;
        protected bool isOnEndDrag = false;
        protected Vector3 offsetVector3 = Vector3.zero;
    
    	void Start()
    	{
            inertia = false;
            movementType = MovementType.Unrestricted;
            //计算摇杆块的半径
            mRadius = (transform as RectTransform).sizeDelta.x * 0.5f;
    	}
    
        public override void OnScroll(PointerEventData data)
        {
    
        }
    	public override void OnDrag (PointerEventData eventData)
    	{
    		base.OnDrag (eventData);
            isOnEndDrag = false;
    		var contentPostion = this.content.anchoredPosition;
    		if (contentPostion.magnitude > mRadius){
    			contentPostion = contentPostion.normalized * mRadius ;
    		    SetContentAnchoredPosition(contentPostion);
    		}
    	}
    
        public override void OnEndDrag(PointerEventData eventData)
        {
            base.OnEndDrag(eventData);
            if (!isOnEndDrag)
                isOnEndDrag = true;
        }
    
        void Update()
        {
            UpdateContent();
        }
    
        /// <summary>
        /// 摇杆小球复位
        /// </summary>
        public void UpdateContent()
        {
            if (isOnEndDrag)
            {
                if (content.localPosition == Vector3.zero)
                    isOnEndDrag = false;
                float x = Mathf.Lerp(content.localPosition.x, 0.0f, recoveryTime);
                float y = Mathf.Lerp(content.localPosition.y, 0.0f, recoveryTime);
                content.localPosition = new Vector3(x, y, content.localPosition.z);
            }
            CalculateOffset();
        }
        /// <summary>
        /// 计算偏移量
        /// </summary>
        private void CalculateOffset()
        {
            offsetVector3 = content.localPosition / mRadius;
        }
        /// <summary>
        /// 获取偏移量大小
        /// 偏移量范围是[-1,1]
        /// </summary>
        /// <returns></returns>
        public Vector3 GetOffsetVector3()
        {
            return offsetVector3;
        }
    }

    这里要注意一点,我在start函数里面修改了movementType,如果没有修改movementType参数的同学是没办法实现这个功能的~切记切记!!

    最后上一张图片,红框的位置是要特别注意的地方!


    今天写了两篇文章好累啊,我会尽量把自己学到研究到的东西都写出来,可能会很乱很杂大家别介意哈....哈哈哈哈~~

                                                                                                                                                                                                                                                                                               -----Begonia

    展开全文
  • Unity 简单的虚拟摇杆

    千次阅读 2019-04-04 17:00:05
    需求:点击创建一个虚拟摇杆底盘,鼠标拖拽时候上方摇杆会跟随鼠标方向移动,并且不会超出摇杆盘范围 using System.Collections; using System.Collections.Generic; using UnityEngine; public class ...

    需求:点击创建一个虚拟摇杆底盘,鼠标拖拽时候上方摇杆会跟随鼠标方向移动,并且不会超出摇杆盘范围
    *摇杆功能另外实现

    在这里插入图片描述
    在这里插入图片描述


    UI显示

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class RockingIcon : MonoBehaviour
    {
      public Transform touchPoint;
      public Transform bgPoint;
      public float radius;
      bool isPressing;
      Vector3 bgPos;
    
      private void Update()
      {
        bool pressing;
        Vector3 pos;
        if (Application.isEditor)
          GetPressingInfoInEditor(out pressing, out pos);
        else
          GetPressingInfoInPhone(out pressing, out pos);
        SetIcon(pressing, pos);
    
      }
    
      void GetPressingInfoInEditor(out bool pressing, out Vector3 pos)
      {
        if (Input.GetMouseButton(0))
        {
          pressing = true;
          pos = Input.mousePosition;
        }
        else
        {
          pressing = false;
          pos = Vector3.zero;
        }
      }
    
      void GetPressingInfoInPhone(out bool pressing, out Vector3 pos)
      {
        if(Input.touchCount > 0)
        {
          pressing = true;
          pos = Input.GetTouch(0).position;
        }
        else
        {
          pressing = false;
          pos = Vector3.zero;
        }
      }
    
    
      void SetIcon(bool pressing, Vector3 pos)
      {
        if (pressing)
        {
          if (!isPressing)
          {
            bgPoint.gameObject.SetActive(true);
            bgPoint.transform.position = pos;
            bgPos = pos;
            isPressing = true;
          }
          else
          {
            bgPoint.gameObject.SetActive(true);
            SetTouchPointPos(pos);
          }
        }
        else
        {
          touchPoint.gameObject.SetActive(false);
          bgPoint.gameObject.SetActive(false);
          isPressing = false;
        }
      }
    
      void SetTouchPointPos(Vector3 pos)
      {
        Vector3 center = bgPoint.position;
        Vector3 touch = pos;
        Vector3 to;
        float distance = Vector3.Distance(center, touch);
        if (distance < radius)
          to = touch;
        else
        {
          Vector3 dir = touch - center;
          dir.Normalize();
          to = dir * radius;
          to += center;
        }
        touchPoint.gameObject.SetActive(true);
        touchPoint.transform.position = to;
      }
    }
    
    

    预制:
    在这里插入图片描述


    操作控制

        #region 鼠标操作
    
        float min_move_x = Global.min_move_distance * (Screen.width / 1080f);
        float min_move_y = Global.min_move_distance * (Screen.height / 1900f);
    
        if(Application.platform == RuntimePlatform.WindowsEditor)
        {
          if (Input.GetMouseButtonDown(0))
          {
            touch_time = 0;
            first_touch_pos = Input.mousePosition;
          }
          else if (Input.GetMouseButton(0))
          {
    
            touch_time += Time.deltaTime;
            if (touch_time >= Global.touch_time_limit)
            {
             Vector2 touch_pos = Input.mousePosition;
              Vector2 distance = touch_pos - first_touch_pos;
    
              //Vector2 touch_pos_in_func = PosInTheFunc(touch_pos);
              //Vector2 first_pos_in_func = PosInTheFunc(first_touch_pos);
              //Vector2 distance = touch_pos_in_func - first_pos_in_func;
    
              if (Mathf.Abs(distance.x) > min_move_x && Mathf.Abs(distance.x) > Mathf.Abs(distance.y)) Move(distance.x > 0 ? Vector3.right : Vector3.left);
              if (Mathf.Abs(distance.y) > min_move_y && Mathf.Abs(distance.y) > Mathf.Abs(distance.x)) Move(distance.y > 0 ? Vector3.forward : Vector3.back);
            }
          }
          else if (Input.GetMouseButtonUp(0))
          {
    
            //if(touch_time < Global.touch_time_limit)
            //{
            //  PutBoomb();
            //}
            touch_time = 0;
            first_touch_pos = Vector3.zero;
          }
        }
        #endregion
        #region 手机操作
    
        if (Application.platform == RuntimePlatform.Android)
        {
          if (Input.touchCount > 0)
          {
    
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
            {
              first_touch_pos = touch.position;
              
    
            }
            else if (touch.phase == TouchPhase.Ended)
            {
              first_touch_pos = Vector3.zero;
            }
            else if (touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary)
            {
              Vector2 touch_pos = touch.position;
              Vector2 distance = touch_pos - first_touch_pos;
              if (Mathf.Abs(distance.x) > min_move_x && Mathf.Abs(distance.x) > Mathf.Abs(distance.y)) Move(distance.x > 0 ? Vector3.right : Vector3.left);
              if (Mathf.Abs(distance.y) > min_move_y && Mathf.Abs(distance.y) > Mathf.Abs(distance.x)) Move(distance.y > 0 ? Vector3.forward : Vector3.back);
    
            }
          }
        }
    
    展开全文
  • Unity3d虚拟摇杆控制物体移动及旋转

    千次阅读 2018-02-26 21:15:06
    王者荣耀在现在看来可能已经成为不少人每天都会打开一...此篇博客就unity中如何实现利用UI(虚拟摇杆)控制物体的移动和旋转。罗马的路很多,这里只是其中一条,还望多提出问题,共同学习。首先,创建一个场景物体如...

       王者荣耀在现在看来可能已经成为不少人每天都会打开一款软件,角色的控制及其操作方式简单,使其短时间内获得了大量的玩家喜爱和追捧。

        可以很明显的看到王者荣耀的操作方式就是虚拟摇杆,可以控制人物的的移动,及其旋转,或者是控制技能的释放方向。此篇博客就unity中如何实现利用UI(虚拟摇杆)控制物体的移动和旋转。罗马的路很多,这里只是其中一条,还望多提出问题,共同学习。

    首先,创建一个场景

    物体如下: (创建一个炮嘴,方便观察)


    接着是创建UI,网上素材有很多,随便就可以搜出来好看的图片

    图片:

    层级面板:



    简单操作后,进入到代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    using UnityEngine.UI;
    
    
    public class JoyStick : MonoBehaviour {
        //摇杆
        private GameObject center;
        //摇杆位置限制
        public float PositionRange;
        //得到物体
        private GameObject cube;
        //移动速度
        public float  MoveSpeed;
        //平滑度
        public float smoothing;
    	// Use this for initialization
    	void Start () {
            //拿到摇杆
            center = transform.Find("Center").gameObject;
            cube = GameObject.Find("Cube");
            //绑定事件
            UIEventTrigger.Get(center).onPointerDown = MoveByPC;//※
        }
        private void MoveByPC(PointerEventData data)
        {
            StartCoroutine("MovePC");
        }
        IEnumerator MovePC()    
        {
            while (Input.GetMouseButton(0))
            {
                // center.transform.position = Input.mousePosition;初级版摇杆移动
                //拿到鼠标的坐标
                Vector3 MousePos = new Vector3(Input.mousePosition.x,Input.mousePosition.y,0);//平面坐标,只需要得到X,Y
                //偏移量的计算  = 鼠标-  大圆盘
                Vector3 offset = MousePos - this.transform.position;
                //限制移动范围
                if (offset.magnitude>PositionRange)//※
                {
                    //新的偏移量 = 规定范围  *  偏移量的方向  
                    offset = PositionRange * offset.normalized;//偏移量的单位化(得到方向)
                }
                //摇杆的移动= 初始位置   +   偏移量
                center.transform.position = this.transform.position + offset;
                //移动赋给玩家
                    //求得移动方向
                    Vector3 dir = new Vector3(offset.x,0,offset.y);
                    cube.transform.Translate(dir.normalized*Time.deltaTime*MoveSpeed,Space.World);
                //旋转赋给物体
                Quaternion qua = Quaternion.LookRotation(dir.normalized);//※  将Vector3类型转换四元数类型
                cube.transform.rotation = Quaternion.Lerp(cube.transform.rotation, qua, Time.deltaTime * smoothing);//四元数的插值,实现平滑过渡
                yield return null;
            }
            //鼠标松开,摇杆位置复位(初始化)
            center.transform.localPosition = Vector3.zero;
        }
    	// Update is called once per frame
    	void Update () {
    		
    	}
    }
    

    引用脚本UIEventTrigger,关于该脚本的使用和说明详见点击打开链接。简单解释几句,在UI物体上的不同的操作方式,比如点击,双击,拖拽扥操作,可以执行其对应的监听事件。在虚拟摇杆中用到的是onPointDown(注意大小写,方法不同),当鼠标点击时执行的监听事件。UIEventTrigger熟悉后,会改善我们的开发的效率。

    还使用到了协程,协程的定义和使用详见点击打开链接

    现在开始理一下逻辑:我们操作模拟摇杆 当手指按下拖拽移动时,小圆盘式跟随着我们的手指的,当手指离开屏幕,小圆盘回到初始位置,即大圆盘的位置。先实现这一步:

    使用到了UIEventTrigger中的onPointerDown监听事件,当鼠标即手指按下时 触发监听事件,开始协程

    协程内:鼠标为按下状态时进入循环,讲鼠标位置转换为世界坐标(或者将摇杆转换为屏幕坐标计算也可以),和大圆盘的位置相减得到变化矢量。控制变化量的大小,控制在合适范围内。

    offset.magnitude是Vector3 的一个方法,将矢量转换为长度,这里使用方便判断。

    如果超出范围,变化量应等于最大的范围。

    将变化量赋值给摇杆,注释解释的很清楚了。

    控制摇杆的位置之后,需要把变化量的方向赋给我们的物体,为什么是方向呢,因为我们只需要他的方向,在此之前,应该看一下物体是在哪个平面移动,比如说由x,z轴组合的平面内移动,则需要把变化量转换成这个平面内的矢量,因为,我们的矢量是x,y轴组成的平面内的矢量,需要转换一下。

    然后就是简单的移动代码,需要注意的是方向的矢量需要单位化,原因是1*任何数=任何数,方法是 “矢量.normalized”。

    然后赋值旋转 此处用到了四元数的一个方法Quternion.LookRotation,具体了解点击打开链接,可以理解为把三维坐标(方向)转换成四元数,在赋值给这个物体的旋转,四元数不必过多纠结。因为不好理解。。。

    Quternion.Lerp为线性差值,在很多地方都有这个方法,详见点击打开链接

    当鼠标抬起,即退出while循环时,让摇杆复位。

    旋转可以写一个新脚本里面用另一个摇杆控制。

    好了,到此这篇博客就结束了,其实对小白和新手并不友好。但是路会越走越宽,终有一天会学到,理解到。

    展开全文
  • Unity3D基于UGUI的虚拟摇杆实现

    千次阅读 2017-10-17 12:40:09
    虚拟摇杆在移动游戏开发中,是很常见的需求,今天我们在Unity中,使用UGUI来实现一个简单的虚拟摇杆功能。 1.打开Unity,新创建一个UIJoystick.cs脚本,代码如下: using UnityEngine; using UnityEngine....
  • 简单的unity3D创建虚拟摇杆和控制角色移动利用ScrollRect创建虚拟摇杆效果图为虚拟摇杆写脚本创建虚拟摇杆虚拟摇杆控制角色转弯以及移动 利用ScrollRect创建虚拟摇杆 效果图 为虚拟摇杆写脚本 首先我们要继承...
  • Unity3d手机游戏开发经常用到的插件,easy touch5插件是非常实用的,可以很容易实现手游的虚拟摇杆功能控制游戏人物的走动方向。但此插件在Asset Store中是收费的,大约20美元,在这里我为同学们奉献出来了,记得...
  • unity3d虚拟摇杆贴图集合

    热门讨论 2020-07-30 12:54:42
    unity3d虚拟摇杆贴图集合,再也不用担心缺少虚拟摇杆的图片了
  • Unity3d使用UGUI开发原生虚拟摇杆

    千次阅读 2018-06-14 16:04:42
    Unity3d中开发虚拟摇杆方式有比较多,可以使用EasyTouch、FairyGUI等插件来开发。本文给大家介绍使用Unity3d的原生UGUI来开发出自己的虚拟摇杆,这样可以减少游戏资源包的大小。先展示下效果图:现在开发我们的...
  • 虚拟摇杆在移动游戏开发中,是很常见的需求,今天我们在Unity中,使用UGUI来实现一个简单的虚拟摇杆功能。
  • unity3d 虚拟摇杆 ugui

    2018-04-17 11:08:49
    网上找了好多都嫌麻烦,谷歌了一下,完美解决。 需要先建立 Canvas,如下: 代码拖拽到 backImage里: JoyStick.cs using System.Collections; using System.Collections.Generic;...using UnityEng...
  • unity3d 虚拟摇杆

    千次阅读 2015-08-08 10:27:51
    using UnityEngine; using System.Collections; public class CcJoystick : MonoBehaviour { public Transform m_Bg;//背景框框 public Transform m_Icon;... float m_fRadius = 100f;... private b
  • 最近的项目中需要开发虚拟摇杆功能,由于历史原因对于FingerGesture较为熟悉,故没有采用EasyTouch。 NGUI中的UIDragObject NGUI中有一个UIDragObject.cs组件,添加到GameObject,即可实现简单的拖拽动作。 其中的...
  • unity中的2D虚拟摇杆和3D虚拟摇杆

    千次阅读 2017-12-06 20:40:10
    3D虚拟摇杆 截屏2D虚拟摇杆:3D虚拟摇杆:示例使用 _joystick.State 获取拖拽状态: - Start, - Dragging, - End,使用 _joystick.DraggingHandler 摇杆偏移量.public class Example : MonoBehaviour
  • Unity3D 虚拟摇杆(之一)

    万次阅读 2013-05-30 15:34:33
    想使用Unity3D在手机上实现虚拟摇杆的功能,通过拖动左侧虚拟摇杆控制人物移动,在手机上运行效果如下:  初始时考虑使用官方Joystick,但是使用GUITexture时与游戏中其他功能冲突. 使用官方Joystick的JavaScript...
  • 今天呢,我们来一起学习在Unity3D中使用EasyTouch虚拟摇杆来控制人物移动。尽管Unity3D内置了一个Joystick组件(其实就是一个GUITexture和一个Js脚本文件啦),可是博主在实际使用的时候发现这个内置的Joystick存在...
  • Unity3D 虚拟摇杆 NGUI实现方法

    千次阅读 2014-07-04 23:31:56
    首先呢,先声明一下哈,这个脚本从头到尾都是我自己设计和编写的哈,再加上今年就大四啦,所以要也开始镀一点金啦,所以呢,各位朋友也帮一下忙哈,能赞一个就赞一个哈,多多交流,共同进步哈,而且在您转载、修改、...
  • Unity3D 虚拟摇杆(之二)C#

    千次阅读 2013-05-30 15:34:20
    根据官方虚拟摇杆代码示例JavaScript翻译而成,非插件在移动设备上实现虚拟摇杆功能,使用GUITexture. using UnityEngine; /** * File: MPJoystick.cs * Author: Chris Danielson of (monkeyprism.com) * ...
  • 1、近期笔者研究unity3D移动开发,然后打算做虚拟摇杆。初始时考虑使用官方Joystick,但是使用GUITexture时与NGUI插件有冲突,最后选择EasyJoystick做摇杆,那是相当简单了,呵呵,话不多说,看效果图:2、步骤: ...
  • Unity 虚拟摇杆Unity内置插件实现

    千次阅读 2017-10-14 16:50:38
    今天我们来学习如何利用Unity3d自带的摇杆组件,实现利用摇杆来控制角色的移动。 今天所用到的例子参考了网上的一个教程(http://www.unitymanual.com/thread-5189-1-1.html),原文用javascript实现了。我这里用...
1 2 3 4 5 ... 17
收藏数 324
精华内容 129
关键字:

unity3d虚拟摇杆