Существуют джойстики и игровые объекты.
Джойстик и игровой объект работают нормально, если работают по отдельности.
Но когда вы пытаетесь с ними работать одновременно, игровой объектtouch touch зависит от сенсорного джойстика.
Я пытался решить эту проблему более двух недель. Но я не смог.
Ниже приведены скрипты для джойстика и игрового объекта.
public class Crosshair : MonoBehaviour
{
private Touch touch;
private Vector3 screenSpace;
private Vector3 offset;
private void Update()
{
if(Input.touchCount > 0)
{
for (int i = 0; i < Input.touchCount; i++)
{
if (EventSystem.current.IsPointerOverGameObject(i) == false)
{
touch = Input.GetTouch(i);
if (touch.phase == TouchPhase.Began)
{
OnFingerDown();
}
if (touch.phase == TouchPhase.Moved)
{
OnDrag();
}
}
}
}
}
void OnFingerDown()
{
screenSpace = Camera.main.WorldToScreenPoint(transform.position);
offset = transform.position - Camera.main.ScreenToWorldPoint
(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
}
void OnDrag()
{
if (Input.mousePosition.x > Screen.width / 2)
{
var curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
transform.position = curPosition;
transform.position = new Vector3(Mathf.Clamp(transform.position.x, -18, 18),
Mathf.Clamp(transform.position.y, -10, 10), transform.position.z);
}
}
}
public class JoystickController : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
[SerializeField] private RectTransform rect_Background;
[SerializeField] private RectTransform rect_Joystick;
private float radius;
[SerializeField] private GameObject player;
[SerializeField] private float speed;
public bool isTouch = false;
private Vector3 touchPos;
void Start()
{
radius = rect_Background.rect.width * 0.5f;
}
// Update is called once per frame
void Update()
{
if (isTouch)
player.transform.position += touchPos;
}
public void OnDrag(PointerEventData eventData)
{
Vector2 value = eventData.position - (Vector2)rect_Background.position;
value = Vector2.ClampMagnitude(value, radius);
rect_Joystick.localPosition = value;
float disrance = Vector2.Distance(rect_Background.position, rect_Joystick.position) / radius;
value = value.normalized;
touchPos = new Vector3(value.x * speed * disrance * Time.deltaTime, value.y * speed * disrance * Time.deltaTime, 0);
}
public void OnPointerDown(PointerEventData eventData)
{
isTouch = true;
}
public void OnPointerUp(PointerEventData eventData)
{
isTouch = false;
rect_Joystick.localPosition = Vector2.zero;
touchPos = Vector3.zero;
}
}
ps.Я использовал переводчик. Таким образом, содержание может быть трудным для понимания, и мне жаль это.