joystick相关
这里直接改标准资源包CrossPlatformInput的代码:
- 把方形移动控制区域摇杆改为圆形
- 在调用摇杆输出的坐标值时,将它离散化,使它在一定的角度范围内x=0或y=0
** 摇杆绑定此脚本:**
using System;
using UnityEngine;
using UnityEngine.EventSystems;
namespace UnityStandardAssets.CrossPlatformInput
{
public class Joystick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
public enum AxisOption
{
// Options for which axes to use
Both, // Use both
OnlyHorizontal, // Only horizontal
OnlyVertical // Only vertical
}
public int MovementRange = 100;
public AxisOption axesToUse = AxisOption.Both; // The options for the axes that the still will use
public string horizontalAxisName = "Horizontal"; // The name given to the horizontal axis for the cross platform input
public string verticalAxisName = "Vertical"; // The name given to the vertical axis for the cross platform input
Vector3 m_StartPos;
bool m_UseX; // Toggle for using the x axis
bool m_UseY; // Toggle for using the Y axis
CrossPlatformInputManager.VirtualAxis m_HorizontalVirtualAxis; // Reference to the joystick in the cross platform input
CrossPlatformInputManager.VirtualAxis m_VerticalVirtualAxis; // Reference to the joystick in the cross platform input
void OnEnable()
{
CreateVirtualAxes();
}
void Start()
{
m_StartPos = transform.position;
}
void UpdateVirtualAxes(Vector3 value)
{
var delta = m_StartPos - value;
delta.y = -delta.y;
delta /= MovementRange;
if (m_UseX)
{
m_HorizontalVirtualAxis.Update(-delta.x);
}
if (m_UseY)
{
m_VerticalVirtualAxis.Update(delta.y);
}
}
void CreateVirtualAxes()
{
// set axes to use
m_UseX = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyHorizontal);
m_UseY = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyVertical);
// create new axes based on axes to use
if (m_UseX)
{
m_HorizontalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(horizontalAxisName);
CrossPlatformInputManager.RegisterVirtualAxis(m_HorizontalVirtualAxis);
}
if (m_UseY)
{
m_VerticalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(verticalAxisName);
CrossPlatformInputManager.RegisterVirtualAxis(m_VerticalVirtualAxis);
}
}
public void OnDrag(PointerEventData data)
{
Vector3 newPos = Vector3.zero;
Vector2 DeltaPositonVerctor = Vector2.zero;
Vector2 m_StartPos_v2 = new Vector2(m_StartPos.x,m_StartPos.y);
if (m_UseX || m_UseY)
{
DeltaPositonVerctor = data.position - m_StartPos_v2;
if (DeltaPositonVerctor.sqrMagnitude > MovementRange * MovementRange)
{
transform.position = new Vector3(m_StartPos.x + DeltaPositonVerctor.normalized.x * MovementRange, m_StartPos.y + DeltaPositonVerctor.normalized.y * MovementRange, m_StartPos.z + newPos.z);
UpdateVirtualAxes(transform.position);
}
}
}
public void OnPointerUp(PointerEventData data)
{
transform.position = m_StartPos;
UpdateVirtualAxes(m_StartPos);
}
public void OnPointerDown(PointerEventData data) { }
void OnDisable()
{
// remove the joysticks from the cross platform input
if (m_UseX)
{
m_HorizontalVirtualAxis.Remove();
}
if (m_UseY)
{
m_VerticalVirtualAxis.Remove();
}
}
}
}
屏幕滑动视角控制相关
** 滑动屏幕控制视角移动**
- 需要检测Input事件是否由joystick移动触发或者位置处于joystick区域,避免干扰
- 位置比较需要先转换坐标系,把屏幕上点的坐标转化为世界坐标
- 获取滑动事件的位移量
void RotateCamera()
{
if (Input.touchCount == 0) return;
float delta_x, delta_y;
float MaxSens = 0.01f;
Vector2 localPoint,InputPosition;
RectTransform rectTrans = JoyStick.GetComponent<RectTransform>();
Rect joystickWorldArea = rectTrans.rect;
Touch touch = Input.GetTouch(0);
InputPosition = touch.position;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTrans, InputPosition, Camera.main, out localPoint))
{
if (!rectTrans.rect.Contains(localPoint))
{
if (touch.phase == TouchPhase.Moved)
{
delta_x = touch.deltaPosition.x / 50;
delta_y = touch.deltaPosition.y / 50;
EulerAngle.y = transform.localEulerAngles.y + delta_x * Xsensitivity * Time.deltaTime;
EulerAngle.x -= delta_y * Ysensitivity * Time.deltaTime;
EulerAngle.x = Mathf.Clamp(EulerAngle.x, XMin, XMax);
// Player GameObiect only rotate in Y axis
transform.localEulerAngles = new Vector3(0, EulerAngle.y, 0);
// camera gameobject rotate in X axis(Y axis keeps the same with player aleardy)
MainCamera.transform.localEulerAngles = new Vector3(EulerAngle.x, 0, 0);
ShoorCamera.transform.localEulerAngles = new Vector3(EulerAngle.x, 0, 0);
}
else return;
}
}
else return;
}
、视角旋转(屏幕滑动)同时控制&spm=1001.2101.3001.5002&articleId=140253984&d=1&t=3&u=646dea21278b4ef19a794e671cfdbe50)
3922

被折叠的 条评论
为什么被折叠?



