【转】NGUI版虚拟摇杆
http://blog.csdn.net/anyuanlzh/article/details/40107577
下面是我用nui实现的一个虚拟摇杆。
1,示图
2、代码如下,都有比较详细的注释,就不说明了。
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- [ExecuteInEditMode]
- public class Joystick : MonoBehaviour
- {
- #region Delegate & Event
- public delegate void JoystickEventHandler(Joystick joystick);
- /// <summary>
- /// 开如
- /// </summary>
- public static event JoystickEventHandler On_JoystickMoveStart;
- /// <summary>
- /// Occurs when the joystick move.
- /// </summary>
- public static event JoystickEventHandler On_JoystickMove;
- /// <summary>
- /// thumb偏离中心位置,并牌按住时,每帧的回调
- /// </summary>
- public static event JoystickEventHandler On_JoystickHolding;
- /// <summary>
- /// Occurs when the joystick stops move
- /// </summary>
- public static event JoystickEventHandler On_JoystickMoveEnd;
- #endregion
- #region property
- [SerializeField] bool isRunInEditor = false;
- [SerializeField]private string joystickName = "NguiJoystick";
- public string JoystickName { get { return this.joystickName; } }
- [HideInInspector]private bool isLimitInCircle = true;
- public bool IsLimitInCircle { get { return this.isLimitInCircle; } }
- [SerializeField]private int radius = 100;
- public int Radius { get{ return this.radius; } }
- [SerializeField]
- private float minAlpha = 0.3f;
- public float MinAlpha { get { return this.minAlpha; } }
- private Vector2 joystickAxis = Vector2.zero;
- /// <summary>
- /// Gets the joystick axis value between -1 & 1...
- /// </summary>
- /// <value>
- /// The joystick axis.
- /// </value>
- public Vector2 JoystickAxis { get { return this.joystickAxis; } }
- private Vector2 lastJoystickAxis = Vector2.zero;
- public Vector2 LastJoystickAxis { get { return this.lastJoystickAxis; } }
- bool isForBid = false;
- /// <summary>
- /// 判断joystick是否被禁用
- /// </summary>
- public bool IsForBid { get { return this.isForBid; } }
- bool isHolding = false;
- public bool IsHolding { get { return this.isHolding; } }
- #endregion
- UIWidget root;
- [SerializeField]UISprite bg;
- [SerializeField]UISprite thumb;
- void Awake()
- {
- this.name = this.JoystickName;
- root = this.GetComponent<UIWidget>();
- Init();
- }
- // Update is called once per frame
- void Update ()
- {
- if (isRunInEditor && Application.isEditor && !Application.isPlaying)
- {
- SetJoystickSize(radius);
- }
- if (!isForBid && isHolding)
- {
- Debug.Log("111111");
- if (On_JoystickHolding != null)
- {
- On_JoystickHolding(this);
- }
- }
- }
- void Init()
- {
- bg.transform.localPosition = Vector3.zero;
- thumb.transform.localPosition = Vector3.zero;
- SetJoystickSize(radius);
- Lighting(minAlpha);
- }
- #region ngui event
- ///// <summary>
- ///// test
- ///// </summary>
- //void OnClick ()
- //{
- // Debug.Log("mouse pos :" + Input.mousePosition + " -- touch pos :" + ScreenPos_to_NGUIPos(Input.mousePosition));
- // thumb.transform.localPosition = ScreenPos_to_NGUIPos(Input.mousePosition);
- //}
- void OnPress (bool isPressed)
- {
- if (isForBid)
- {
- Debug.Log("joystick is forbid!");
- return;
- }
- Debug.Log("OnPress:" + isPressed.ToString());
- if(isPressed)
- {
- Lighting(1f);
- CalculateJoystickAxis();
- if (On_JoystickMoveStart != null)
- {
- On_JoystickMoveStart(this);
- }
- isHolding = true;
- }
- else
- {
- CalculateJoystickAxis();
- if (On_JoystickMoveEnd != null)
- {
- On_JoystickMoveEnd(this);
- }
- thumb.transform.localPosition = Vector3.zero;
- FadeOut(1f, minAlpha);
- isHolding = false;
- }
- }
- //void OnDragStart ()
- //{
- // if (isForBid)
- // {
- // Debug.Log("joystick is forbid!");
- // return;
- // }
- // Debug.Log("OnDragStart");
- // Lighting(1f);
- // CalculateJoystickAxis();
- // if(On_JoystickMoveStart!=null)
- // {
- // On_JoystickMoveStart(this);
- // }
- // isHolding = true;
- // Debug.Log(string.Format("time:{0} - axis:{1}", Time.time, joystickAxis));
- //}
- void OnDrag(Vector2 delta)
- {
- if (isForBid)
- {
- return;
- }
- //Debug.Log("OnDrag:"+delta.ToString());
- CalculateJoystickAxis();
- if (On_JoystickMoveStart != null)
- {
- On_JoystickMoveStart(this);
- }
- }
- //void OnDragEnd ()
- //{
- // if (isForBid)
- // {
- // return;
- // }
- // Debug.Log("OnDragEnd");
- // CalculateJoystickAxis();
- // if (On_JoystickMoveEnd != null)
- // {
- // On_JoystickMoveEnd(this);
- // }
- // thumb.transform.localPosition = Vector3.zero;
- // FadeOut(1f, minAlpha);
- // isHolding = false;
- //}
- #endregion
- #region utile
- /// <summary>
- /// 计算JoystickAxis
- /// </summary>
- /// <returns></returns>
- void CalculateJoystickAxis()
- {
- Vector3 offset = ScreenPos_to_NGUIPos(UICamera.currentTouch.pos);
- offset -= transform.localPosition;
- if (isLimitInCircle)
- {
- if (offset.magnitude > radius)
- {
- offset = offset.normalized * radius;
- }
- }
- thumb.transform.localPosition = offset;
- lastJoystickAxis = joystickAxis;
- joystickAxis = new Vector2(offset.x / radius, offset.y / radius);
- }
- /// <summary>
- /// Axis2s the angle.
- /// </summary>
- /// <returns>
- /// The angle.
- /// </returns>
- public float Axis2Angle(bool inDegree = true)
- {
- float angle = Mathf.Atan2(joystickAxis.x, joystickAxis.y);
- if (inDegree)
- {
- return angle * Mathf.Rad2Deg;
- }
- else
- {
- return angle;
- }
- }
- /// <summary>
- /// Axis2s the angle.
- /// </summary>
- /// <returns>
- /// The angle.
- /// </returns>
- public float Axis2Angle(Vector2 axis, bool inDegree = true)
- {
- float angle = Mathf.Atan2(axis.x, axis.y);
- if (inDegree)
- {
- return angle * Mathf.Rad2Deg;
- }
- else
- {
- return angle;
- }
- }
- /// <summary>
- /// 屏幕坐标-->ui坐标
- /// </summary>
- /// <param name="screenPos"></param>
- /// <returns></returns>
- Vector3 ScreenPos_to_NGUIPos(Vector3 screenPos)
- {
- Vector3 uiPos = UICamera.currentCamera.ScreenToWorldPoint(screenPos);
- uiPos = UICamera.currentCamera.transform.InverseTransformPoint(uiPos);
- return uiPos;
- }
- /// <summary>
- /// 屏幕坐标-->ngui坐标
- /// </summary>
- /// <param name="screenPos"></param>
- /// <returns></returns>
- Vector3 ScreenPos_to_NGUIPos(Vector2 screenPos)
- {
- return ScreenPos_to_NGUIPos(new Vector3(screenPos.x, screenPos.y, 0f));
- }
- /// <summary>
- /// 设置摇杆的大小
- /// </summary>
- /// <param name="radius"></param>
- void SetJoystickSize(int radius)
- {
- root.width = 2 * radius;
- root.height = 2 * radius;
- thumb.width = (int)(40f / 100f * root.width);
- thumb.height = (int)(40f / 100f * root.height);
- }
- /// <summary>
- /// 点亮摇杆
- /// </summary>
- void Lighting(float alpha)
- {
- iTween.Stop(this.gameObject, "value");
- root.alpha = alpha;
- }
- /// <summary>
- /// 渐变摇杆的透明度
- /// </summary>
- void FadeOut(float fromAlpha, float toAlpha)
- {
- Hashtable itweenArgs = new Hashtable();
- itweenArgs.Add("easetype", iTween.EaseType.linear);
- itweenArgs.Add("from", fromAlpha);
- itweenArgs.Add("to", toAlpha);
- itweenArgs.Add("time", 0.5f);
- itweenArgs.Add("onupdate", "OnFadeOutTween");
- iTween.ValueTo(this.gameObject, itweenArgs);
- }
- void OnFadeOutTween(float value)
- {
- root.alpha = value;
- }
- #endregion
- #region 激活、禁用的控制
- List<string> keys = new List<string>();
- /// <summary>
- /// 禁用
- /// </summary>
- /// <returns>返回值是,取消这个禁用要用到的key</returns>
- public string ForbidJosystick()
- {
- string key = System.Guid.NewGuid().ToString();
- keys.Add(key);
- isForBid = true;
- return key;
- }
- /// <summary>
- /// 启用
- /// </summary>
- /// <param name="key"></param>
- public void ActivizeJosystick(string key)
- {
- if(keys.Contains(key))
- {
- keys.Remove(key);
- }
- isForBid = true;
- if(keys.Count==0)
- {
- isForBid = false;
- }
- }
- #endregion
- }
3、demo包,有兴趣的,也可以看看。
下载:
【转】NGUI版虚拟摇杆的更多相关文章
- NGUI版虚拟摇杆
以下是我用nui实现的一个虚拟摇杆. 1,示图 2.代码例如以下,都有比較具体的凝视.就不说明了. using UnityEngine; using System.Collections; using ...
- 【转】简单的虚拟摇杆控制移动(NGUI)
http://www.cnblogs.com/zhangbaochong/p/4928688.html 一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个B ...
- 简单的虚拟摇杆控制移动(NGUI)
一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个BoxCollider,再创建一个sprite child作为虚拟摇杆中间的按钮,叫做button 二.通 ...
- unity中虚拟摇杆的实现
实现效果: 实现: 使用NGUI添加虚拟摇杆背景和其子物体按钮,为按钮Attach boxcollider和ButtionScript.为按钮添加如下脚本: 注意:其中的静态属性可以在控制物体移动的 ...
- Unity3d项目入门之虚拟摇杆
Unity本身不提供摇杆的组件,开发者可以使用牛逼的EasyTouch插件或者应用NGUI实现相关的需求,下面本文通过Unity自身的UGUI属性,实现虚拟摇杆的功能. 主参考 <Unity:使 ...
- Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆
Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆 效果如图所示 摇杆的UI组成 如图所示 简单的可以认为摇杆由1.2.3贴图组成 为摇杆的底座 为摇杆的杆 为摇杆的指向 可以理解这就是街机上的 ...
- 【转】Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机
http://blog.csdn.net/begonia__z/article/details/51178907 前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控 ...
- [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动
大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei.今天呢,我们来一起学习在Unity3D中使用EasyTouch虚拟摇杆来控制人物移动.虽然Un ...
- unity零基础开始学习做游戏(三)鼠标输入,来个虚拟摇杆怎么样?
-------小基原创,转载请给我一个面子 现在移动游戏越来越火,大家都拿手机平板玩游戏,没有键盘和手柄输入,所以就不得不看看虚拟摇杆怎么搞?(小基对于没有实体反馈不是很喜欢呢) 首先要清楚,鼠标操作 ...
随机推荐
- APP性能分析1
我们使用云测试平台对产品进行了性能测试,情况如下: 详见这里.
- Spring的循环依赖问题
spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循环引用类: 在Spring中将循环依赖的处理分成了3种情况: 构造器循环依赖 ...
- ZooKeeper使用原理
ZooKeeper的基本原理 ZNode的基本概念 ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode.每个ZNode都可以通过其路径唯一标识 ...
- LCS(打印路径) POJ 2250 Compromise
题目传送门 题意:求单词的最长公共子序列,并要求打印路径 分析:LCS 将单词看成一个点,dp[i][j] = dp[i-1][j-1] + 1 (s1[i] == s2[j]), dp[i][j] ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- SZU-A22
Problem(A22):Party Judge InfoMemory Limit: 32768KBCase Time Limit: 10000MSTime Limit: 10000MSJudger: ...
- wp7 HubTile
在最新的Windows Phone Toolkit中我们可以看到HubTile这个控件,首先先了解下什么是HubTile,简单来说,就是允许你给你的应用程序添加些生动或富有意义的瓦片(Tile).Hu ...
- [leetCode][016] Add Two Numbers
[题目]: You are given two linked lists representing two non-negative numbers. The digits are stored in ...
- [shell] if else以及大于、小于、等于逻辑表达式 [转]
本文也即<Learning the bash Shell>3rd Edition的第五章Flow Control之读书笔记,但我们将不限于此.flow control是任何编程语言中很常用 ...
- cvReleaseImage 释放内存出错
cvReleaseImage是OpenCV中C语言库中的释放图片内存的函数,比如我们加载或者克隆了一幅图片,当不需要这幅图片了时,我们为了避免内存泄露,需要释放这些空间,可以参见我之前的博客OpenC ...