核心代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI; public delegate void JoystickMoveDelegate(JoystickData data); public class Joystick : MonoBehaviour { public GameObject joystickUI; //摇杆整体UI,方便Active
public RectTransform joystickCenter; //摇杆重心
public RectTransform joystickBackground; //摇杆背景 private float halfScreenWidth;
private float halfScreenHeight;
private RectTransform joystickRect;
private float radius;
private Vector3 lastMousePosition; public static event JoystickMoveDelegate JoystickMoveEvent; // Use this for initialization
void Start () {
halfScreenWidth = Screen.width / 2;
halfScreenHeight = Screen.height / 2;
joystickRect = this.gameObject.GetComponent<RectTransform>();
radius = 71; } // Update is called once per frame
void Update () {
JoystickController();
} public void JoystickController()
{
//鼠标一直按下
if (Input.GetMouseButton(0))
{
float distance = Vector2.Distance(new Vector2(Input.mousePosition.x, Input.mousePosition.y), joystickRect.anchoredPosition); if (distance < radius)
{
//当距离小于半径就开始移动 摇杆重心
joystickCenter.anchoredPosition = new Vector2(Input.mousePosition.x - joystickRect.anchoredPosition.x, Input.mousePosition.y - joystickRect.anchoredPosition.y);
}
else
{
//求圆上的一点:(目标点-原点) * 半径/原点到目标点的距离
Vector2 endPosition = (new Vector2(Input.mousePosition.x, Input.mousePosition.y) - joystickRect.anchoredPosition) * radius / distance;
joystickCenter.anchoredPosition = endPosition;
} if (JoystickMoveEvent != null)
{ JoystickMoveEvent(new JoystickData() { x = joystickCenter.anchoredPosition.x - joystickBackground.anchoredPosition.x, y = joystickCenter.anchoredPosition.y - joystickBackground.anchoredPosition.y });
} } //鼠标按下
if (Input.GetMouseButtonDown(0))
{
this.joystickUI.SetActive(true); //鼠标单击左边屏幕
if (Input.mousePosition.x < halfScreenWidth)
{
joystickRect.anchoredPosition = Input.mousePosition; } //鼠标单击右边屏幕
if (Input.mousePosition.x >= halfScreenWidth)
{
// Debug.Log("鼠标单击右边");
}
} //鼠标释放的时候
if (Input.GetMouseButtonUp(0))
{
this.joystickUI.SetActive(false);
}
}
} public class JoystickData
{
public float x;
public float y; }

 

效果图:

 

Unity5.1版本:

实例下载地址: http://yunpan.cn/cchdURtqCWXxv  访问密码 0aba

UGUI实现摇杆(模仿太极熊猫)的更多相关文章

  1. unity使用UGUI创建摇杆

    1.现在unity做一个项目,各种插件各种包,于是项目资源就无限变大了,其实一些简单的功能可以自己写,这里就是试着使用UGUI编写一个摇杆功能 2.脚本如下: using UnityEngine; u ...

  2. ugui自制摇杆。

    珍爱生命,远离插件. 以上8个字,好好理解. 反正我是这么觉得. 我说的是unity,不是魔兽世界. 总有一天,我会一句一句写出属于自己的东西. 可以开始主题了.         如图所示,建立一个画 ...

  3. UGUI实现摇杆

    效果图

  4. UGUI简易摇杆

    实现 直接使用系统自带圆形控件图标 编写脚本, 实现UGUI拖拽事件 将多拽范围限定于给定半径和圆心的圆内 计算出等同于Input.GetAxis()的值,直接控制被控制物体 代码 using Sys ...

  5. 【转】ugui自制摇杆

    http://www.cnblogs.com/duyushuang/p/4457691.html 珍爱生命,远离插件. 以上8个字,好好理解. 反正我是这么觉得. 我说的是unity,不是魔兽世界. ...

  6. [Unity] UGUI研究院之游戏摇杆

    最近在做Unity基于UGUI的摇杆,发现了一种非常简单并且巧妙的方法,原文在这里, 不过要FQ!!http://godstamps.blogspot.tw/2015/07/unity-ugui-sc ...

  7. 【转】Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机

    http://blog.csdn.net/begonia__z/article/details/51178907 前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控 ...

  8. 【转】Unity3D学习日记(一)使用UGUI制作虚拟摇杆

    http://blog.csdn.net/begonia__z/article/details/51170059 如今手机游戏玩法多种多样,尤其使用虚拟摇杆进行格斗类游戏开发或者是MMORPG成为了主 ...

  9. UGUI(四)事件系统的封装

    UGUI的事件系统默认使用时,是需要当前的类继承事件接口,就可以在该类中加入它的事件方法,但是在多人开发时这种方式没什么好处. 用过NGUI的或许都知道UIEventListener这个类,因为使用超 ...

随机推荐

  1. Java IO :文件

    在java应用程序中,文件是一种常用的数据源或者存储数据的媒介.所以这一小节将会对Java中文件的使用做一个简短的概述.这里只提供一些必要的知识点. 通过Java IO读文件 如果你需要在不同端之间读 ...

  2. NetAnalyzer笔记 之 六 用C#打造自己的网络连接进程查看器(为进程抓包做准备)

    [创建时间:2016-04-13 22:37:00] NetAnalyzer下载地址 起因 最近因为NetAnalyzer2016的发布,好多人都提出是否可以在NetAnalyzer中加入一个基于进程 ...

  3. Git冲突解决方案

    Git冲突解决方案 1.  在代码提交时,先更新,若有冲突.先解决冲突.若提交之后在review时才发现无法合并代码时有冲突,需要abandon此次提交的代码. 2.  解决冲突的基本做法,保存本地代 ...

  4. Sftp和ftp 差别、工作原理等(汇总ing)

    Sftp和ftp over ssh2的差别 近期使用SecureFx,涉及了两个不同的安全文件传输协议: -sftp -ftp over SSH2 这两种协议是不同的.sftp是ssh内含的协议,仅仅 ...

  5. java后台訪问url连接——HttpClients

    java后台訪问url,并传递数据--通过httpclient方式 须要的包,包可能多几个额外的,假设无用或者冲突删除就可以.httpclient是使用的是4.4.1的版本号:http://downl ...

  6. EasyInvoice 使用教程 - (1) 认识 EI

    原视频下载地址:EI 主界面介绍 1. 主界面截图 2. 基础资料界面截图 3. 管理员 界面截图

  7. AngularJs练习Demo1

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  8. hive函数总结-日期函数

    获取当前UNIX时间戳函数: unix_timestamp语法: unix_timestamp() 返回值: bigint说明: 获得当前时区的UNIX时间戳举例: hive> select u ...

  9. linux环境下jdk 安装以及maven私服搭建

    1:准备资源      linux服务器,jdk和nexus  安装包    2:网络通畅,保持windows端和linux服务器端网络通畅.     3: 安装jdk和配置环境变量      进入到 ...

  10. sql 合并列

    1.合并一列用“ ,”号隔开. 如下图: 这样的一列我想直接在sql里面合并最后变成:586,444,444,444,444这样的效果,平常的做法是直接把这列数据取出来,在前端循环加上逗号,但其实是可 ...