NGUI版虚拟摇杆
以下是我用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版虚拟摇杆
http://blog.csdn.net/anyuanlzh/article/details/40107577 下面是我用nui实现的一个虚拟摇杆. 1,示图 2.代码如下,都有比较详细的注释,就不说 ...
- 【转】简单的虚拟摇杆控制移动(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零基础开始学习做游戏(三)鼠标输入,来个虚拟摇杆怎么样?
-------小基原创,转载请给我一个面子 现在移动游戏越来越火,大家都拿手机平板玩游戏,没有键盘和手柄输入,所以就不得不看看虚拟摇杆怎么搞?(小基对于没有实体反馈不是很喜欢呢) 首先要清楚,鼠标操作 ...
随机推荐
- navicat for mysql 在win7下设置定时计划之导出数据处理
navicat for mysql 在win7下设置定时计划之导出数据处理 博客分类: mysql navitcatmysql定时任务导出 前两篇记录了,navicat for mysql计划的入门 ...
- Jupyter Notebook与Jupyterhub的安装与配置
Jupyter Notebook是一个很好用的交互环境,Jupyterhub则在此基础上实现了多用户的管理.最近配置这个环境的时候也遇到了一些坑,想想自己疯狂百度的过程,在此把自己的完整安装配置流程记 ...
- Android中如何截取字符串中某个字符之前或之后的字符串
代码改变世界 Android中如何截取字符串中某个字符之前或之后的字符串 //截取#之前的字符串 String str = "sdfs#d"; str.substring(0, s ...
- read(byte[] b)与readFully(byte[] b)
转载于:http://yyzjava.iteye.com/blog/1178525 要搞清楚read(byte[] b)和readFully(byte[] b)的区别,可以从以下方面着手分析: 1.代 ...
- iOS学习笔记47-Swift(七)泛型
一.Swift泛型介绍 泛型是为Swift编程灵活性的一种语法,在函数.枚举.结构体.类中都得到充分的应用,它的引入可以起到占位符的作用,当类型暂时不确定的,只有等到调用函数时才能确定具体类型的时候可 ...
- [luoguP3302] [SDOI2013]森林(主席树 + 启发式合并 + lca)
传送门 显然树上第k大直接主席树 如果连边的话,我们重构小的那一棵,连到另一棵上. 说起来简单,调了我一晚上. 总的来说3个错误: 1.离散化写错位置写到了后面 2."="写成了& ...
- 浅谈Android反调试 之 PTRACE_TRACEME
反调试原理: 关于Ptrace: http://www.cnblogs.com/tangr206/articles/3094358.html ptrace函数 原型为: #include & ...
- bzoj3997[TJOI2015]组合数学(求最长反链的dp)
组合数学 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走 ...
- d3 数据绑定
绑定过程 选择元素,绑定数据,追加元素 <!DOCTYPE html> <html> <head> <title>testD3-.html</ti ...
- APUE 学习笔记(三) 文件和目录
1. 文件类型 文件类型信息包含在 struct stat 里的 st_mode 成员 (1)普通文件,unix内核并不区分文本文件和二进制文件 (2)目录文件,这种文件包含了其他文件的名字以及指向这 ...