【问题标题】:Unity 5 Inventory system not workingUnity 5库存系统不起作用
【发布时间】:2017-09-01 00:21:27
【问题描述】:

全世界的程序员你好。我为自己的游戏制作了一个库存系统。唯一的问题是,当我单击项目然后将其拖动到空插槽时,它不会移动,我有点看不到我遇到的错误,我试图调试它但没有成功任何帮助?代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class Inventory : MonoBehaviour {

private RectTransform inventoryRect;

private float inventoryWidth;
private float inventoryHeight;

public int slots;
public int rows;

public float slotPaddingLeft;
public float slotPaddingTop;

public float slotSize;

public GameObject slotPrefab;

private static Slot from;
private static Slot to;

private List<GameObject> allslots;

public GameObject iconPrefab;

private static GameObject hoverObject;

private static int emptySlots;

public Canvas canvas;

private float hoverYOffset;

private bool isPressed;

public EventSystem eventSystem;

public static int EmptySlots{
    get{ return emptySlots;}
    set{ emptySlots = value;}
}

// Use this for initialization
void Start () {
    CreateLayout ();
    canvas.enabled = false;
    isPressed = false;
}

// Update is called once per frame
void Update () {
    if (Input.GetKeyDown (KeyCode.I)) {
        if (Input.GetKeyDown (KeyCode.I)) {
            canvas.enabled = false;
        }
        canvas.enabled = true;
    }

    if (Input.GetMouseButtonUp (0)) {
        if (!eventSystem.IsPointerOverGameObject (-1) && from != null) {
            from.GetComponent<Image> ().color = Color.white;
            from.ClearSlot ();
            Destroy (GameObject.Find ("Hover"));
            to = null;
            from = null;
            hoverObject = null;
        }
    }

    if (hoverObject != null) {
        Vector2 position;
        RectTransformUtility.ScreenPointToLocalPointInRectangle (canvas.transform as RectTransform, Input.mousePosition, canvas.worldCamera, out position);
        position.Set (position.x, position.y - hoverYOffset);
        hoverObject.transform.position = canvas.transform.TransformPoint (position);
    }
}

private void CreateLayout(){
    allslots = new List<GameObject> ();

    hoverYOffset = slotSize * 0.01f;

    emptySlots = slots;

    inventoryWidth = (slots / rows) * (slotSize + slotPaddingLeft) + slotPaddingLeft;
    inventoryHeight = rows * (slotSize + slotPaddingTop) + slotPaddingTop;

    inventoryRect = GetComponent<RectTransform> ();

    inventoryRect.SetSizeWithCurrentAnchors (RectTransform.Axis.Horizontal, inventoryWidth);
    inventoryRect.SetSizeWithCurrentAnchors (RectTransform.Axis.Vertical, inventoryHeight);

    int colums = slots / rows;

    for (int y = 0; y < rows; y++) {
        for (int x = 0; x < colums; x++) {
            GameObject newSlot = (GameObject)Instantiate (slotPrefab);

            RectTransform slotRect = newSlot.GetComponent<RectTransform> ();

            newSlot.name = "Slot";
            newSlot.transform.SetParent (this.transform.parent);

            slotRect.localPosition = inventoryRect.localPosition + new Vector3 (slotPaddingLeft * (x + 1) + (slotSize * x), -slotPaddingTop * (y + 1) - (slotSize * y));
            slotRect.SetSizeWithCurrentAnchors (RectTransform.Axis.Horizontal, slotSize);
            slotRect.SetSizeWithCurrentAnchors (RectTransform.Axis.Vertical, slotSize);

            allslots.Add (newSlot);
        }
    }
}

public bool AddItem(Item item){
    if (item.maxSize == 1) {
        PlaceEmpty (item);
        return true;
    }
    else {
        foreach (GameObject slot in allslots) {
            Slot temporary = slot.GetComponent<Slot> ();
            if (!temporary.IsEmpty) {
                if (temporary.CurrentItem.type == item.type && temporary.IsAvailable) {
                    temporary.AddItem (item);
                    return true;
                }
            }
        }
        if (emptySlots > 0) {
            PlaceEmpty (item);
        }
    }
    return false;
}

private bool PlaceEmpty(Item item){
    if (emptySlots > 0) {
        foreach (GameObject slot in allslots) {
            Slot temporary = slot.GetComponent<Slot> ();
            if (temporary.IsEmpty) {
                temporary.AddItem (item);
                emptySlots--;
                return true;
            }
        }
    }
    return false;
}

public void MoveItem(GameObject clicked){

    if (from == null) {
        if (!clicked.GetComponent<Slot> ().IsEmpty) {
            from = clicked.GetComponent<Slot> ();
            from.GetComponent<Image> ().color = Color.gray;

            hoverObject = (GameObject)Instantiate (iconPrefab);
            hoverObject.GetComponent<Image> ().sprite = clicked.GetComponent<Image> ().sprite;
            hoverObject.name = "Hover";

            RectTransform hoverTransform = hoverObject.GetComponent<RectTransform> ();
            RectTransform clickedTransform = clicked.GetComponent<RectTransform> ();

            hoverTransform.SetSizeWithCurrentAnchors (RectTransform.Axis.Horizontal, clickedTransform.sizeDelta.x);
            hoverTransform.SetSizeWithCurrentAnchors (RectTransform.Axis.Vertical, clickedTransform.sizeDelta.y);

            hoverObject.transform.SetParent (GameObject.Find ("Canvas").transform, true);
            hoverObject.transform.localScale = from.gameObject.transform.localScale;
        }
    } 
    else if (to = null) {
        to = clicked.GetComponent<Slot> ();
        Destroy (GameObject.Find ("Hover"));
    }
    if (to != null && from != null) {
        Stack<Item> tmpTo = new Stack<Item> (to.Items);
        to.AddItems (from.Items);
        if (tmpTo.Count == 0) {
            from.ClearSlot ();
        } 
        else {
            from.AddItems (tmpTo);
        }

        from.GetComponent<Image> ().color = Color.white;
        to = null;
        from = null;
        hoverObject = null;
    }
}

}

导致问题的方法是 MoveItem() 遗憾的是它不是空引用或空指针,我只是没有想法一直在苦苦挣扎几天......任何关于如何解决这个问题的建议会很有帮助,而且确实非常受欢迎。提前致谢!

【问题讨论】:

    标签: unity3d unity5


    【解决方案1】:

    我没有仔细看你的代码,但我马上就看到了这个问题:

    else if (to = null) {
        to = clicked.GetComponent<Slot> ();
        Destroy (GameObject.Find ("Hover"));
    }
    

    这导致结束位置设置为空。要解决此问题,请更改为双等号,如下所示:

    else if (to == null) {
        to = clicked.GetComponent<Slot> ();
        Destroy (GameObject.Find ("Hover"));
    }
    

    如果这不能解决您的问题,请告诉我,我会更加努力地查看您的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2021-10-20
      • 2013-08-25
      • 2022-10-07
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多