成为拼多多腾讯会员免费领取2017如何领取

我想买一个摇杆,但不要太贵,谁可以帮帮我_拳皇97吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:202,263贴子:
我想买一个摇杆,但不要太贵,谁可以帮帮我
键盘78线,键盘比较差,...
全新 玩不了出了
这个波如何? 比地波某...
都说新3ds有摇杆用着爽...
没图你们是不会来的
除了杆子是三合的,其它...
3D双端东方魔幻网游「大青云」勾魂公测,穿越逆转,封神故事,全新演绎!
楼主新年快乐,我是拳霸摇杆客服,有意可以加我Q
168元请见我签名
亲,你好。有兴趣可以加我QQ,为您推荐一款称心如意的摇杆
贴吧热议榜
使用签名档&&
保存至快速回贴1648 好笑 &
882 好笑 &
265 好笑 &
444 好笑 &
5277 好笑 &
452 好笑 &
906 好笑 &
159 好笑 &
141 好笑 &
181 好笑 &
388 好笑 &
212 好笑 &
592 好笑 &
1165 好笑 &
3943 好笑 &
201 好笑 &
349 好笑 &
161 好笑 &
糗事精选:0
星座:双子座
糗龄:1302天4505人阅读
[移动互联](50)
[Unity引擎](86)
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是。最近因为项目需要决定尝试自己来实现一个虚拟摇杆,所以在今天的文章中我们的目标是使用uGUI来制作一个可以在移动平台稳定运行的虚拟摇杆(请不要问我为什么不使用NGUI来实现,你说我做个虚拟摇杆有必要在项目里导入那么多的资源嘛23333)。关于使用第三方插件来实现虚拟摇杆,请大家参照我以前写的文章,在这里就不再赘述了。
虚拟摇杆这种输入方式相信大家在手机游戏平台上已经相当的熟悉了,首先我们来简单了解下虚拟摇杆的设计原理。虚拟摇杆有一张固定的2D贴图(背景层)和一张可拖动的2D贴图(控制层)构成,默认情况下控制层在背景层的中心,我们称这个位置为初始位置,当移动控制层后移动层的位置会发生变化,此时控制层的当前位置和初始位置两点间可以计算出一个2D向量,通过这个向量我们就可以判断虚拟摇杆的移动方向。在经典的八方向摇杆导航中摇杆中可移动方向被分成了上、左上、右上、下、左下、右下、左、右共8个方向。我们知道根据三角函数可以非常容易地计算出这个2D向量的角度并由此判定摇杆是在向着这8个方向中的哪一个方向移动。在今天的文章中,我们不需要考虑这8个方向,因为我们可以向任何一个方向进行移动。
好了,首先在场景中创建两个Image组件和一个空的游戏体,然后将这两个Image组件拖拽到这个空的游戏体下使它们称为其子节点。这里需要注意的是这两个Image的层级关系。现在我们来编写脚本,这个脚本将被添加到控制层物体上:
using UnityE
using System.C
using UnityEngine.UI;
using UnityEngine.EventS
public class JoyStick : MonoBehaviour,IPointerDownHandler, IPointerUpHandler, IDragHandler
摇杆最大半径
以像素为单位
public float JoyStickRadius = 50;
摇杆重置所诉
public float JoyStickResetSpeed = 5.0f;
当前物体的Transform组件
private RectTransform selfT
是否触摸了虚拟摇杆
private bool isTouched = false;
虚拟摇杆的默认位置
private Vector2 originP
虚拟摇杆的移动方向
private Vector2 touchedA
public Vector2 TouchedAxis
if(touchedAxis.magnitude & JoyStickRadius)
return touchedAxis.normalized / JoyStickR
return touchedAxis.
定义触摸开始事件委托
public delegate void JoyStickTouchBegin(Vector2 vec);
定义触摸过程事件委托
虚拟摇杆的移动方向
public delegate void JoyStickTouchMove(Vector2 vec);
定义触摸结束事件委托
public delegate void JoyStickTouchEnd();
注册触摸开始事件
public event JoyStickTouchBegin OnJoyStickTouchB
注册触摸过程事件
public event JoyStickTouchMove OnJoyStickTouchM
注册触摸结束事件
public event JoyStickTouchEnd OnJoyStickTouchE
void Start ()
selfTransform = this.GetComponent&RectTransform&();
originPosition = selfTransform.anchoredP
public void OnPointerDown(PointerEventData eventData)
isTouched = true;
touchedAxis = GetJoyStickAxis(eventData);
if(this.OnJoyStickTouchBegin != null)
this.OnJoyStickTouchBegin(TouchedAxis);
public void OnPointerUp(PointerEventData eventData)
isTouched = false;
selfTransform.anchoredPosition = originP
touchedAxis = Vector2.
if(this.OnJoyStickTouchEnd != null)
this.OnJoyStickTouchEnd();
public void OnDrag(PointerEventData eventData)
touchedAxis = GetJoyStickAxis(eventData);
if(this.OnJoyStickTouchMove != null)
this.OnJoyStickTouchMove(TouchedAxis);
void Update()
if(isTouched && touchedAxis.magnitude&=JoyStickRadius)
if(this.OnJoyStickTouchMove != null)
this.OnJoyStickTouchMove(TouchedAxis);
if(selfTransform.anchoredPosition.magnitude & originPosition.magnitude)
selfTransform.anchoredPosition -= TouchedAxis * Time.deltaTime * JoyStickResetS
返回虚拟摇杆的偏移量
The joy stick axis.
Event data.
private Vector2 GetJoyStickAxis(PointerEventData eventData)
Vector3 worldP
if (RectTransformUtility.ScreenPointToWorldPointInRectangle (selfTransform,
eventData.position, eventData.pressEventCamera, out worldPosition))
selfTransform.position = worldP
Vector2 touchAxis = selfTransform.anchoredPosition-originP
if(touchAxis.magnitude &= JoyStickRadius)
touchAxis = touchAxis.normalized * JoyStickR
selfTransform.anchoredPosition = touchA
return touchA
在这段脚本中,我们实现了OnPointerDown、OnPointerUp和OnDrag三个uGUI事件接口,然后注册了相关的事件委托,这里借鉴了EasyTouch的设计,可以使得虚拟摇杆的逻辑和角色控制逻辑相互分离。这里的核心方法是GetJoyStickAxis()方法,通过这个方法我们可以获得一个Vector2类型的值,它表示的是未标准化过的虚拟摇杆的偏移量。这里的RectTransformUtility.ScreenPointToWorldPointInRectangle()方法表示将一个屏幕坐标转化为对应RectTransform的世界坐标,RectTransform的anchoredPosition属性表示的是当前元素在场景中的屏幕坐标。我们知道屏幕坐标是以像素为单位的,因此这里使用屏幕坐标可以计算出虚拟摇杆在水平方向和垂直方向上移动了多少个像素,我们以此来作为虚拟摇杆的偏移量衡量指标。TouchedAxis是经过标准化以后的偏移量,我们将把这个值传递到事件委托中以提供给外部来调用。好了,要说的就这些了,没有说到的大家可以看看代码里的注释或者是在博客中给我留言,就是这样啦。
接下来,我们在场景中添加一个角色模型来测试我们编写的虚拟摇杆,因为在JoyStick中我们已经定义了事件委托,所以在这里就是简单的调用啦。好了,我们一起来看看代码吧!
using UnityE
using System.C
public class JoyStick3D : MonoBehaviour
private JoyS
void Start ()
js = GameObject.FindObjectOfType&JoyStick& ();
js.OnJoyStickTouchBegin += OnJoyStickB
js.OnJoyStickTouchMove += OnJoyStickM
js.OnJoyStickTouchEnd += OnJoyStickE
void OnJoyStickBegin(Vector2 vec)
Debug.Log("开始触摸虚拟摇杆");
void OnJoyStickMove (Vector2 vec)
Debug.Log("正在移动虚拟摇杆");
Quaternion q = Quaternion.LookRotation (new Vector3 (vec.x, 0, vec.y));
transform.rotation =
transform.Translate(Vector3.forward * 75f * Time.deltaTime);
animation.CrossFade("Run");
void OnJoyStickEnd ()
Debug.Log("触摸移动摇杆结束");
animation.CrossFade("idle");
void OnGUI()
GUI.Label(new Rect(30,30,200,30),"3D模式下的虚拟摇杆测试");
最终程序的运行效果如下图所示,我们编写的这个虚拟摇杆可以在手机上完美的运行,欢饮大家来一起测试和吐槽!
好了,今天的内容就是这样啦!欢迎大家继续关注我的博客,希望大家喜欢!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:854193次
积分:10887
积分:10887
排名:第1095名
原创:185篇
评论:1122条
秦元培,程序员、游戏开发者
如果觉得我的我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
(2)(5)(1)(4)(2)(5)(4)(1)(5)(4)(2)(1)(5)(4)(1)(7)(13)(1)(2)(1)(9)(8)(2)(5)(9)(23)(8)(13)(18)(7)(1)(1)(2)(1)(1)(1)(2)(1)(3)(1)

我要回帖

更多关于 拼多多成为试用会员 的文章

 

随机推荐