Как автоматически завершить игру в Unity? - PullRequest
1 голос
/ 20 июня 2019

Я следовал руководству на YouTube (доступно по этой ссылке ), чтобы показать, как перетаскивать предметы в моей игре.Кто-нибудь знает, как я мог адаптировать код, чтобы игра автоматически заканчивалась или меняла сцену, когда все плитки были размещены в доступных слотах?Я также хотел бы знать, есть ли какой-либо способ запретить пользователю бросать плитку в слот, в котором она уже есть?Это весь исходный код, который у меня уже есть:

Исходный код слотов

public class Slot : MonoBehaviour, IDropHandler {
    public GameObject item {
        get {
            if(transform.childCount>0){
                return transform.GetChild (0).gameObject;
            }
            return null;
        }
    }

    #region IDropHandler implementation
    public void OnDrop (PointerEventData eventData)
    {
        if(!item){
            DragHandeler.itemBeingDragged.transform.SetParent (transform);
            ExecuteEvents.ExecuteHierarchy<IHasChanged>(gameObject,null,(x,y) => x.HasChanged ());
        }
    }

Исходный код DragHandler:

public void OnBeginDrag (PointerEventData eventData)
    {
        itemBeingDragged = gameObject;
        startPosition = transform.position;
        startParent = transform.parent;
        GetComponent<CanvasGroup>().blocksRaycasts = false;
    }

    #endregion

    #region IDragHandler implementation

    public void OnDrag (PointerEventData eventData)
    {
        transform.position = eventData.position;
    }

    #endregion

    #region IEndDragHandler implementation

    public void OnEndDrag (PointerEventData eventData)
    {
        itemBeingDragged = null;
        GetComponent<CanvasGroup>().blocksRaycasts = true;
        if(transform.parent == startParent){
            transform.position = startPosition;
        }
    }

1 Ответ

2 голосов
/ 20 июня 2019

Чтобы изменить сцену, вам нужно использовать это:

SceneManager.LoadScene(scenename);

Вот Документация LoadScene .

Если вам нужно также помочь с логикой, куда поместитьэто в вашем проекте - пожалуйста, добавьте свой код и некоторые дополнительные пояснения о том, что вы делаете, вместо ссылки на 22 минуты какого-то учебника.


Обновление:

Вот способ изменить сцену, когда все слоты заполнены:

public void OnDrop (PointerEventData eventData)
{
    if(!item)
    {
        DragHandeler.itemBeingDragged.transform.SetParent (transform);
        ExecuteEvents.ExecuteHierarchy<IHasChanged>(gameObject,null,(x,y) => x.HasChanged ());

        // This code will check if all slots are full and load new scene if they are
        // If you already have an array/list of all your slots, you can replace this "FindObjectsOfType" with it
        Slot[] allSlots = FindObjectsOfType<Slot>();
        bool areAllBackpackSlotsFull = true;
        foreach (Slot slot in allSlots)
        {
            if (slot.isBackpack == true && slot.item == null)
            {
                areAllBackpackSlotsFull = false;
                break;
            }
        }
        if (areAllBackpackSlotsFull)
        {
            string nextSceneName = "YourScene"; // Place the name of scene you want to load next
            UnityEngine.SceneManagement.SceneManager.LoadScene(nextSceneName);
        }
    }
}

Вы также спросили:

Я также хотел бы знать, есть лиспособ запретить пользователю бросать плитку в слот, в котором она уже есть?

Но я вижу, что она, кажется, уже реализована в вашем коде.Есть проверка, является ли текущий элемент нулевым в функции «OnDrop» Slot, это должно делать именно то, что вы хотите - размещать плитку, только если слот пуст.Так что это уже должно быть ограничено.Вы уверены, что это не так?


Обновление 2:

Обновление для вашего нового вопроса о рюкзаке и инвентаре.Вы можете просто добавить переменную bool в класс Slot, чтобы отличить рюкзак от инвентаря:

public class Slot : MonoBehaviour, IDropHandler
{
    public bool isBackpack = false;
    ...

Затем в редакторе отметьте все слоты рюкзака для переменной isBackpack true.Это был бы простой и удобный способ их различения.

Также я обновил приведенный выше код (проверяет, заполнен ли рюкзак), поэтому теперь он будет проверять только слоты для рюкзаков.


Обновление 3:

Я заметил, что вы задали еще один вопрос в комментариях:

Был бы способ заблокировать плитку один разего вытащили из инвентаря и бросили в «рюкзак»?то есть, что они не могут переместить это снова?

Это очевидно не связано с оригинальным постом и вопросом, но хорошо, я попытаюсь помочь с этим также ...

Я думаю, что что-то вроде этого может достичь того, чего вы хотите (я изменил ваш код DragHandler):

public void OnBeginDrag (PointerEventData eventData)
{
    Slot currentSlot = gameObject.GetComponentInParent<Slot>();
    if (currentSlot.isBackpack == false)
    {
        itemBeingDragged = gameObject;
        startPosition = transform.position;
        startParent = transform.parent;
        GetComponent<CanvasGroup>().blocksRaycasts = false;
    }
    else
    {
        itemBeingDragged = null;
    }
}

#endregion

#region IDragHandler implementation

public void OnDrag (PointerEventData eventData)
{
    if (itemBeingDragged != null)
        transform.position = eventData.position;
}

#endregion

#region IEndDragHandler implementation

public void OnEndDrag (PointerEventData eventData)
{
    if (itemBeingDragged != null)
    {
        itemBeingDragged = null;
        GetComponent<CanvasGroup>().blocksRaycasts = true;
        if(transform.parent == startParent)
            transform.position = startPosition;
    }
}

Надеюсь, это поможет.


PS Я уже помог вам с 5 разными вопросами.Пожалуйста, если у вас есть еще вопросы, не относящиеся к исходному сообщению, я бы предложил принять ответ, чтобы закрыть эту проблему, и задавать другие вопросы в отдельных сообщениях с новым обновленным кодом и информацией (и вы можете добавить ссылку на этопост в новых постах (вопросах)).Поскольку это просто неправильный способ использовать этот сайт, задавать новые не связанные вопросы в комментариях и постоянно обновлять вопрос и ответ, это просто неудобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...