Unity 玩家移动(摇杆)、视角旋转(屏幕滑动)同时控制

joystick相关

这里直接改标准资源包CrossPlatformInput的代码:

  1. 把方形移动控制区域摇杆改为圆形
  2. 在调用摇杆输出的坐标值时,将它离散化,使它在一定的角度范围内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();
			}
		}
	}
}

屏幕滑动视角控制相关

** 滑动屏幕控制视角移动**

  1. 需要检测Input事件是否由joystick移动触发或者位置处于joystick区域,避免干扰
  2. 位置比较需要先转换坐标系,把屏幕上点的坐标转化为世界坐标
  3. 获取滑动事件的位移量
   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;

   }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值