【转】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零基础开始学习做游戏(三)鼠标输入,来个虚拟摇杆怎么样?
-------小基原创,转载请给我一个面子 现在移动游戏越来越火,大家都拿手机平板玩游戏,没有键盘和手柄输入,所以就不得不看看虚拟摇杆怎么搞?(小基对于没有实体反馈不是很喜欢呢) 首先要清楚,鼠标操作 ...
随机推荐
- jQuery对表单、表格的操作及更多应用(下:其他应用)
内容摘录自锋利的JQuery一书 三.其他应用 1 网页字体大小控制(P164) <span class="bigger">放大</span> <s ...
- 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...
- extjs 动态添加item
<html> <p> </p> <head> <title>测试页面</title> <meta http-equiv=& ...
- Android 第三方
把优酷.土豆等取出它们真是的视频播放地址:http://vparser.com/ volley 项目地址 https://github.com/smanikandan14/Volley-demo (1 ...
- 基于淘宝开源Tair分布式KV存储引擎的整合部署
一.前言 Tair支撑了淘宝几乎所有系统的缓存信息(Tair = Taobao Pair,Pair即Key-Value键值对),内置了三个存储引擎:mdb(默认,类似于Memcache).rdb(类似 ...
- java向图片上写字,两个图片合并的方法
package writeimg; import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; import ...
- for循环下九九乘法表
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 微课程--Android--Android概述
基本上是介绍了一下studio,然后模拟器,对studio的各部分功能有了大致了解 Android studio的文件结构 在Android模式的目录下有三个文件夹,其中Manifests中是配置文件 ...
- ondragover 事件规定在何处放置被拖动的数据
nternet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5 支持拖放. 被拖元素,dragElement : 1.添加事件:ondragstart 2 ...
- IIS服务器下301跳转是怎么样实现的?
301跳转的用法很多,对于一名SEO来说,301转向是必须掌握的本领,但是对于301转向而言,许多人都并不清楚,301跳转以后,需不需要对原网站进行优化,再次提及一边301跳转的定义. 所谓301跳转 ...