unity中摇杆的使用

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.EventSystems;

namespace JoystickPlugin

{

public class Joystick : MonoBehaviour, IPointerUpHandler, IDragHandler, IPointerDownHandler

{

public float Horizontal { get { return (snapX) ? SnapFloat(input.x, AxisOptions.Horizontal) : input.x; } }

public float Vertical { get { return (snapY) ? SnapFloat(input.y, AxisOptions.Vertical) : input.y; } }

public Vector2 Direction { get { return new Vector2(Horizontal, Vertical); } }

public float HandleRange

{

get { return handleRange; }

set { handleRange = Mathf.Abs(value); }

}

public float DeadZone

{

get { return deadZone; }

set { deadZone = Mathf.Abs(value); }

}

public AxisOptions AxisOptions { get { return AxisOptions; } set { axisOptions = value; } }

public bool SnapX { get { return snapX; } set { snapX = value; } }

public bool SnapY { get { return snapY; } set { snapY = value; } }

[SerializeField] private float handleRange = 1;

[SerializeField] private float deadZone = 0;

[SerializeField] private AxisOptions axisOptions = AxisOptions.Both;

[SerializeField] private bool snapX = false;

[SerializeField] private bool snapY = false;

[SerializeField] public RectTransform background = null;

[SerializeField] public RectTransform handle = null;

private RectTransform baseRect = null;

private Canvas canvas;

private Camera cam;

private Vector2 input = Vector2.zero;

private void Awake()

{

HandleRange = 0.5f;

DeadZone = 0;

AxisOptions = AxisOptions.Both;

SnapX = false;

SnapY = false;

background = transform.Find("Background").GetComponent<RectTransform>();

handle = transform.Find("Background/Handle").GetComponent<RectTransform>();

baseRect = GetComponent<RectTransform>();

canvas = transform.parent.GetComponent<Canvas>();

// background = transform.GetComponent<RectTransform>();

Debug.Log("canvas:::" + canvas);

Debug.Log("transform:::" + transform);

// handle = transform.Find("Handle").GetComponent<RectTransform>();

}

protected virtual void Start()

{

HandleRange = handleRange;

DeadZone = deadZone;

baseRect = GetComponent<RectTransform>();

canvas = GetComponentInParent<Canvas>();

if (canvas == null)

Debug.LogError("The Joystick is not placed inside a canvas");

Vector2 center = new Vector2(0.5f, 0.5f);

background.pivot = center;

handle.anchorMin = center;

handle.anchorMax = center;

handle.pivot = center;

handle.anchoredPosition = Vector2.zero;

input = Vector2.zero;

}

public virtual void OnPointerDown(PointerEventData eventData)

{

OnDrag(eventData);

}

public void OnDrag(PointerEventData eventData)

{

cam = null;

if (canvas.renderMode == RenderMode.ScreenSpaceCamera)

cam = canvas.worldCamera;

Vector2 position = RectTransformUtility.WorldToScreenPoint(cam, background.position);

Vector2 radius = background.sizeDelta / 2;

input = (eventData.position - position) / (radius * canvas.scaleFactor);

FormatInput();

HandleInput(input.magnitude, input.normalized, radius, cam);

handle.anchoredPosition = input * radius * handleRange;

}

protected virtual void HandleInput(float magnitude, Vector2 normalised, Vector2 radius, Camera cam)

{

if (magnitude > deadZone)

{

if (magnitude > 1)

input = normalised;

}

else

input = Vector2.zero;

}

private void FormatInput()

{

if (axisOptions == AxisOptions.Horizontal)

input = new Vector2(input.x, 0f);

else if (axisOptions == AxisOptions.Vertical)

input = new Vector2(0f, input.y);

}

private float SnapFloat(float value, AxisOptions snapAxis)

{

if (value == 0)

return value;

if (axisOptions == AxisOptions.Both)

{

float angle = Vector2.Angle(input, Vector2.up);

if (snapAxis == AxisOptions.Horizontal)

{

if (angle < 22.5f || angle > 157.5f)

return 0;

else

return (value > 0) ? 1 : -1;

}

else if (snapAxis == AxisOptions.Vertical)

{

if (angle > 67.5f && angle < 112.5f)

return 0;

else

return (value > 0) ? 1 : -1;

}

return value;

}

else

{

if (value > 0)

return 1;

if (value < 0)

return -1;

}

return 0;

}

public virtual void OnPointerUp(PointerEventData eventData)

{

input = Vector2.zero;

handle.anchoredPosition = Vector2.zero;

}

protected Vector2 ScreenPointToAnchoredPosition(Vector2 screenPosition)

{

Vector2 localPoint = Vector2.zero;

if (RectTransformUtility.ScreenPointToLocalPointInRectangle(baseRect, screenPosition, cam, out localPoint))

{

Vector2 pivotOffset = baseRect.pivot * baseRect.sizeDelta;

return localPoint - (background.anchorMax * baseRect.sizeDelta) + pivotOffset;

}

return Vector2.zero;

}

}

public enum AxisOptions { Both, Horizontal, Vertical }

}

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using JoystickPlugin;

public class testTANK : MonoBehaviour

{

FixedJoystick fx;

public Transform t;

// Start is called before the first frame update

void Start()

{

//滑轮

fx = transform.Find("touch_bg").gameObject.AddComponent<FixedJoystick>();

fx.HandleRange = 0.5f;

fx.enabled = true;

}

// Update is called once per frame

void Update()

{

//Quaternion rotation = Quaternion.LookRotation(fx.Direction);

// 应用旋转到GameObject

//t.localEulerAngles =new Vector3(0,0, Vector2ToAngle(fx.Direction));

t.rotation = Quaternion.Euler(new Vector3(0, 0, Vector2ToAngle(fx.Direction)));

//t.rotation = Quaternion.Euler();

t.transform.Translate(fx.Direction * Time.fixedDeltaTime*50 , Space.World);

}

float Vector2ToAngle(Vector2 vector)

{

// 使用Atan2计算角度,并将弧度转换为度数

float angle = Mathf.Atan2(vector.y, vector.x) * Mathf.Rad2Deg-90f;

// 保证角度为正数

if (angle < 0) angle += 360;

return angle;

}

}

相关推荐
仙魁XAN1 小时前
Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】
unity·设计模式·工厂方法模式·抽象工厂模式
我要吐泡泡了哦3 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
躺下睡觉~11 小时前
Unity-Transform类-父子关系
java·unity·游戏引擎
躺下睡觉~12 小时前
Unity-Transform类-缩放和看向
unity·游戏引擎
君莫愁。14 小时前
【Unity】检测鼠标点击位置是否有2D对象
unity·c#·游戏引擎
咩咩觉主15 小时前
Unity实战案例全解析:PVZ 植物卡片状态分析
unity·c#·游戏引擎
蓝裕安18 小时前
伪工厂模式制造敌人
开发语言·unity·游戏引擎
谢泽浩1 天前
Unity 给模型贴上照片
unity·游戏引擎
z2014z1 天前
Unity Resource System 优化笔记
unity·游戏引擎
王维志1 天前
Unity 高亮插件HighlightPlus介绍
unity·游戏引擎