核心代码:

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

最新文章

  1. Mybatis3.x与Spring4.x整合(转)
  2. ASM:《X86汇编语言-从实模式到保护模式》第12章:存储器的保护
  3. C#报修系统Ⅱ
  4. Install gocode
  5. javascript 的点击复制事件
  6. SuperSocket源码解析之启动过程
  7. CF417D--- Cunning Gena(序列+像缩进dp)
  8. backup mysql for xtrabackup with xbstream and lz4
  9. onsite
  10. CodeForces 645B Mischievous Mess Makers
  11. RGB与HSV之间的转换公式及颜色表
  12. Java 11新功能抢先了解
  13. eclipse如何忽略、过滤不需要提交到svn的文件和目录
  14. jupyter notebook安装纪要
  15. php boolean
  16. mysql 时间戳转换 、cnd、dns 通俗理解
  17. Ubuntu14.04安装CMake3.5.1(转)
  18. SpringBoot 常见问题记录
  19. Android studio 2.0--android增量更新的那些事
  20. C#设计模式系列:抽象工厂模式(AbstractFactory)

热门文章

  1. Eclipse调试时出现source not found的问题
  2. 在ubuntu14.04上部署hadoop2.6.3
  3. JAVA单线程以及java多线程的实现方式
  4. Visual Studio 2010 中的 Web 开发
  5. 寒哥细谈之AutoLayout全解
  6. Android 自定义UI--指南针
  7. ADO.Net总结
  8. c#中serialPort1_DataReceived串口接收事件处理
  9. BestCoder Round #36 (hdu5199)Gunner(水题)
  10. 编译Boost 详细步骤