using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// 摇杆
/// </summary>
public class RockerController : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler
{
public enum JoystickType
{
Fixed, //固定式摇杆
Floating, //浮动式摇杆(根据点击屏幕的位置生成摇杆控制器)
Dynamic //动态摇杆(摇杆可以被动态拖拽)
}
//hor,ver的属性访问器
private float horizontal = 0;
private float vertical = 0;
public float Horizontal
{
get { return horizontal; }
}
public float Vertical
{
get { return vertical; }
}
//类型
public JoystickType joystickType = JoystickType.Fixed;
//大圆
public RectTransform background = null;
//小圆
public RectTransform handle = null;
private RectTransform baseRect = null;
private Canvas canvas;
//相机
public Camera _camera;
public float MoveThreshold;
private float deadZone = 0;
public Vector2 input = Vector2.zero;
private Vector2 center = new Vector2(0.5f, 0.5f);
private Vector2 fixedPosition = Vector2.zero;
public float DeadZone
{
get { return deadZone; }
set { deadZone = Mathf.Abs(value); }
}
protected virtual void Start()
{
baseRect = GetComponent<RectTransform>();
canvas = GetComponentInParent<Canvas>();
background.pivot = center;
handle.anchorMin = center;
handle.anchorMax = center;
handle.pivot = center;
handle.anchoredPosition = Vector2.zero;
fixedPosition = background.anchoredPosition;
SetMode();
}
public void SetMode()
{
if (joystickType == JoystickType.Fixed)
{
background.anchoredPosition = fixedPosition;
background.gameObject.SetActive(true);
}
else
background.gameObject.SetActive(false);
}
public void OnPointerDown(PointerEventData eventData)
{
if (joystickType != JoystickType.Fixed)
{
background.anchoredPosition = ScreenPointToAnchoredPosition(eventData.position);
background.gameObject.SetActive(true);
}
OnDrag(eventData);
}
public void OnDrag(PointerEventData eventData)
{
Vector2 position = Camera.main.WorldToScreenPoint(background.position);//将ui坐标中的background映射到屏幕中的实际坐标
Vector2 radius = background.sizeDelta / 2;
input = (eventData.position - position) / (radius * canvas.scaleFactor);//将屏幕中的触点和background的距离映射到ui空间下实际的距离
HandleInput(input.magnitude, input.normalized, radius, _camera); //对输入进行限制
handle.anchoredPosition = input * radius; //实时计算handle的位置
}
public void OnPointerUp(PointerEventData eventData)
{
if (joystickType != JoystickType.Fixed)
background.gameObject.SetActive(false);
input = Vector2.zero;
handle.anchoredPosition = Vector2.zero;
}
public void HandleInput(float magnitude, Vector2 normalised, Vector2 radius, Camera cam)
{
if (joystickType == JoystickType.Dynamic && magnitude > MoveThreshold)
{
Vector2 difference = normalised * (magnitude - MoveThreshold) * radius;
background.anchoredPosition += difference;
}
if (magnitude > deadZone)
{
if (magnitude > 1)
input = normalised;
}
else
input = Vector2.zero;
}
private Vector2 ScreenPointToAnchoredPosition(Vector2 screenPosition)
{
Vector2 localPoint = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(baseRect, screenPosition, _camera, out localPoint);
return localPoint;
}
void Update()
{
horizontal = handle.localPosition.x;
vertical = handle.localPosition.y;
}
}
using UnityEngine;
/// <summary>
/// 玩家控制
/// </summary>
public class PlayerController : MonoBehaviour
{
/// <summary>
/// 获取摇杆脚本
/// </summary>
public RockerController touch;
/// <summary>
/// 移动速度
/// </summary>
public float moveSpeed;
/// <summary>
/// 旋转速度
/// </summary>
public float RotSpeed;
void Start()
{
}
void Update()
{
MoveControlPlayer();
}
void MoveControlPlayer()
{
float hor = touch.Horizontal;
float ver = touch.Vertical;
Vector3 direction = new Vector3(hor, 0, ver);
if (direction != Vector3.zero)
{
// 开始移动
transform.Translate(transform.forward * Time.deltaTime * moveSpeed, Space.World);
//控制旋转
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(direction), Time.deltaTime * RotSpeed);
}
else
{
// 没有移动
}
}
}
网友评论