Невозможно создать базовые фигуры в Unity через игровое меню.

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

Вот код С# из единства. Я думаю, что это код для спавна, который продолжает зацикливаться, но я хочу, чтобы он перестал зацикливаться.

public class menuScript : MonoBehaviour {
public GameObject[] items;
private itemplacement itemPlacement;
private bool menuWindowToggle = false;
private Rect menuWindowRect = new Rect(300,100,400,400);

private Dictionary<int,string> inventoryNameDictionary;

// icons
public Texture2D cubeIcon;
public Texture2D columnIcon;
public Texture2D sphereIcon;
public Texture2D robotIcon;


// Use this for initialization
void Start () {
    itemPlacement = GetComponent<itemplacement> ();
}

// Update is called once per frame
void Update () {

}
void OnGUI()
{
    for (int i = 0; i <items.Length; i ++) {
        menuWindowToggle = GUI.Toggle (new Rect (800, 50, 100, 50), menuWindowToggle, "Item Menu");
        if (menuWindowToggle) {
            menuWindowRect = GUI.Window (0, menuWindowRect, menuWindowMethod, "Item Menu");

            itemPlacement.SetItem (items [i]);
        }
    }
}
void menuWindowMethod (int windowId)
{
    Dictionary<int,string> inventoryNameDictionary = new Dictionary<int,string> ()
    {
        {0, string.Empty},
        {1, string.Empty},
        {2, string.Empty},
        {3, string.Empty}
    };

    itemClass cube = new itemClass (0, "Cube", cubeIcon, "Top of the line IKEA CUBE, made to break easily");
    itemClass column = new itemClass (1, "Column", columnIcon, "Best Persian Column in world, no need paint, it perfect!!!");
    itemClass sphere = new itemClass (2, "Sphere", sphereIcon, "ITS SPHERICAL.... SPHERICAL!!!");
    itemClass robot = new itemClass (3, "Robot", robotIcon, "Mysterious thing, comes from emails about projects");
    //display inventory
    inventoryNameDictionary [0] = cube.name;
    inventoryNameDictionary [1] = column.name;
    inventoryNameDictionary [2] = sphere.name;
    inventoryNameDictionary [3] = robot.name;

    GUILayout.BeginArea (new Rect (5, 50, 395, 400));
    GUILayout.BeginVertical ();
    GUILayout.Button (inventoryNameDictionary[0], GUILayout.Height (50));
    GUILayout.Button (inventoryNameDictionary[1], GUILayout.Height (50));
    GUILayout.Button (inventoryNameDictionary[2], GUILayout.Height (50));
    GUILayout.Button (inventoryNameDictionary[3], GUILayout.Height (50));
    GUILayout.EndVertical ();
    GUILayout.EndArea ();
}
public class itemClass
{
    public int item;
    public string name;
    public Texture2D icon;
    public string description;

    public itemClass( int ide, string nam, Texture2D ico, string des)
    {
        item = ide;
        name = nam;
        icon = ico;
        description = des;
    }
}

}

Другой код, отвечающий за размещение:

public class itemplacement : MonoBehaviour {
private Transform currentItem;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
    if (currentItem = null) {
        Vector3 m = Input.mousePosition;
        m = new Vector3(m.x,m.y,transform.position.y);
        Vector3 p = camera.ScreenToWorldPoint(m);
        currentItem.position = new Vector3(p.x,0,p.z);
    }
}
public void SetItem(GameObject b){
    currentItem = ((GameObject)Instantiate(b)).transform;
}

}


person Dylan F    schedule 20.04.2015    source источник


Ответы (1)


На самом деле я не знаком со старым графическим интерфейсом (очевидно, Unity не рекомендует его больше использовать), поэтому я посмотрел его здесь: http://docs.unity3d.com/Manual/gui-Basics..html

Насколько я понимаю, код, который вы разместили, заключается в том, что GUI.Window() рисует ваше окно, используя menuWindowMethod() для рисования содержимого, но это только рисует окно. Он не ждет, пока пользователь что-то сделает внутри него. Так как вы написали здесь код, выполнение продолжится сразу же после вызова SetItem.

Поскольку OnGUI вызывается в каждом кадре, а элемент управления Toggle всегда возвращает свое текущее значение, в тот момент, когда вы включаете его, вы запускаете этот цикл и вызываете SetItem один раз для каждого элемента в элементах для каждого кадра.

Я подозреваю, что вы действительно хотите связать эти кнопки, чтобы установить новый currentItem в вашем компоненте itemplacement, когда они будут нажаты, а затем дождаться, пока пользователь снова щелкнет, чтобы вызвать SetItem. Я не думаю, что вам действительно нужен цикл for в функции OnGUI.

person Blake Robertson    schedule 20.04.2015
comment
Правильно, я хочу, чтобы каждая кнопка, на которую нажимает пользователь, генерировала указанный игровой объект и позволяла размещать его в любом месте на местности. Как мне это сделать с помощью этого кода? - person Dylan F; 24.04.2015