Решил избавится от лишнего, по моему мнению, кода Joystick´a в новом ассете Sample Assets (Standart Assets хотят потом заменить им).
Вышел один скрипт без всяких унаследований и лишних пространств имен (только интерфейсы EventSystems).
Код
using UnityEngine;
using UnityEngine.EventSystems;
public class VJoystick : MonoBehaviour, IPointerUpHandler, IPointerDownHandler, IDragHandler
{
public int MovementRange = 100;
[HideInInspector] public static float x;
[HideInInspector] public static float y;
public enum AxisOption
{ // Options for which axes to use
Both, // Use both
OnlyHorizontal, // Only horizontal
OnlyVertical // Only vertical
}
public AxisOption axesToUse = AxisOption.Both; // The options for the axes that the still will use
private Vector3 startPos;
private bool useX; // Toggle for using the x axis
private bool useY; // Toggle for using the Y axis
void Start()
{
startPos = transform.position;
// set axes to use
useX = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyHorizontal);
useY = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyVertical);
}
private void UpdateVirtualAxes(Vector3 value)
{
var delta = startPos - value;
delta.y = -delta.y;
delta /= MovementRange;
if (useX)
x = -delta.x;
if (useY)
y = delta.y;
}
public void OnDrag(PointerEventData data)
{
Vector3 newPos = Vector3.zero;
if (useX)
{
int delta = (int)(data.position.x - startPos.x);
delta = Mathf.Clamp(delta, -MovementRange, MovementRange);
newPos.x = delta;
}
if (useY)
{
int delta = (int)(data.position.y - startPos.y);
delta = Mathf.Clamp(delta, -MovementRange, MovementRange);
newPos.y = delta;
}
transform.position = new Vector3(startPos.x + newPos.x, startPos.y + newPos.y, startPos.z + newPos.z);
UpdateVirtualAxes(transform.position);
}
public void OnPointerUp(PointerEventData data)
{
transform.position = startPos;
UpdateVirtualAxes(startPos);
}
public void OnPointerDown(PointerEventData data)
{
}
}
Проблема в том, что джойстик уже на мобильном тесте игры слишком ограничен и не реагирует на значение переменной Movement Range. По идеи, чем больше Movement Range, тем дальше от начальной точки я могу подвинуть джойстик, но на практике не так. Используя родной скрипт (без моего сокращения) была такая же проблема. В Editor все работает правильно.Добавлено (24 декабря 2014, 18:27)
---------------------------------------------
Я понял! На мобилке требуется число на много больше, чем в Editor. В editor мне достаточно поставить в переменную Movement Range 35, а для мобилки 250... тогда будет все ок...