Пятница, 29 Ноября 2024, 06:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Нужна помощь, не работает скрипт Drag&Drop Unity3D
x_Delta-Foxtrot_xДата: Среда, 17 Ноября 2021, 17:01 | Сообщение # 1
уже был
Сейчас нет на сайте
Делаю можно сказать 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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг