Делаю можно сказать 2.5D игру, на 3D сцене отображается визуал, а сам геймплей в 2D интерфейсе. Хочу сделать систему Drag&Drop, но она не работает корректно.
Суть в том, что игрок перетаскивает карту из интерфейса на 3D сцену, она должна исчезнуть и произвести изменение переменных и визуальные эффекты.
Но проблема в другом Drag&Drop не работает как нужно. Пробовал два скрипта, оба взял из интернета, к сожаления сам не осилил такое написать.
Первый скрипт, просто заставлял уезжать карту непонятно куда, ей не получалось управлять.
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class CardScr : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler{
Camera MainCamera;
Vector3 offset;
void Awake()
{
MainCamera = Camera.main;
}
public void OnBeginDrag(PointerEventData eventData)
{
offset = transform.position - MainCamera.ScreenToWorldPoint(eventData.position);
}
public void OnDrag(PointerEventData eventData)
{
Vector3 newPos = MainCamera.ScreenToWorldPoint(eventData.position);
transform.position = newPos + offset;
}
public void OnEndDrag(PointerEventData eventData)
{
}
}
Второй код вообще ни как не работает, тут два скрипта, один задает класс карте(что её можно перетаскивать). А второй вешается на пустой гейм обджект, и проверяет перетаскивается объект или нет, и соответственно должен реализовать Drag&Drop.
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Draggable : MonoBehaviour
{
}
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DragController : MonoBehaviour
{
private bool _isDragActive = false;
private Vector2 _screenPosition;
private Vector3 _worldPosition;
private Draggable _lastDragged;
private void Awake()
{
DragController[] controllers = FindObjectsOfType<DragController>();
if (controllers.Length > 1)
{
Destroy(gameObject);
}
}
void Update()
{
if (_isDragActive)
{
if (Input.GetMouseButtonUp(0) || (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Ended))
{
Drop();
return;
}
}
if (Input.GetMouseButton(0))
{
Vector3 mousePos = Input.mousePosition;
_screenPosition = new Vector2(mousePos.x, mousePos.y);
}
else if (Input.touchCount > 0)
{
_screenPosition = Input.GetTouch(0).position;
}
else
{
return;
}
_worldPosition = Camera.main.ScreenToWorldPoint(_screenPosition);
if (_isDragActive)
{
Drag();
}
else
{
RaycastHit2D hit = Physics2D.Raycast(_worldPosition, Vector2.zero);
if (hit.collider != null)
{
Draggable draggable = hit.transform.gameObject.GetComponent<Draggable>();
if (draggable != null)
{
_lastDragged = draggable;
InitDrag();
}
}
}
}
void InitDrag()
{
_isDragActive = true;
}
void Drag()
{
_lastDragged.transform.position = new Vector2(_worldPosition.x, _worldPosition.y);
}
void Drop()
{
_isDragActive = false;
}
}
Кто-нибудь знает как это можно решить?
Думаю дело в World Point, но не уверен.
https://prnt.sc/1zwq2fj
https://prnt.sc/1zwq4cd