Pickto
@Pickto

Почему предмет появляется только на коллайдерах?

Есть скрипт, и ,когда я хочу заспавнить предмет с помощью этого скрипта, он появляется только там где есть коллайдер(любой), нельзя ли сделать так чтобы предметы появлялись только в конкретном коллайдаре(тригере)?
// NULLcode Studio © 2015
// null-code.ru

using UnityEngine;
using UnityEngine.UI;
using System;
using System.Collections;

public class Inventory : MonoBehaviour {

	public Transform[] allItems;
	public Sprite[] itemIcon;
	public int iconSize = 50;
	public Sprite background;
	private GameObject[] cell;
	private Texture2D tmpTexture;
	private int iconCoumt;
	private int itemCoumt;
	private GameObject tmpObject;
	private GameObject cell_tmp;
	private Vector2 curPos;
	public static int grid_id;

	void Awake ()
	{
		grid_id = -1;
		cell = new GameObject[transform.childCount];
		for(int j = 0; j < cell.Length; j++)
		{
			cell[j] = transform.GetChild(j).gameObject;
			cell[j].GetComponentInChildren<Grid>().ID = j;
		}
	}

	void Reset()
	{
		if(tmpTexture)
		{
			tmpTexture = null;
			if(grid_id == -1 && !tmpObject)
			{
				// создание объекта с добавлением высоты по Y
				GameObject clone = Instantiate(allItems[itemCoumt].gameObject, curPos, Quaternion.identity);
			}
		}
		if(tmpObject)
		{
			tmpObject.SetActive(true);
			tmpObject = null;
		}
		cell_tmp = null;
	}

	void Update () 
	{
		RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector3.zero);
		if (hit.collider != null)
		{
			curPos = hit.point;
			if(Input.GetMouseButton(0))
			{
				if(hit.transform.GetComponent<AddToInventory>() && !tmpTexture)
				{
					tmpObject = hit.transform.gameObject;
					tmpObject.SetActive(false);
					int i = hit.transform.GetComponent<AddToInventory>().itemID;
					for(int j = 0; j < itemIcon.Length; j++)
					{
						// поиск id массива иконок, относительно номера объекта
						string n = itemIcon[j].name.Split(new char[] {'_'}, StringSplitOptions.RemoveEmptyEntries)[0];
						if(n == i.ToString())
						{
							tmpTexture = itemIcon[j].texture;
							iconCoumt = j;
							for(int f = 0; f < allItems.Length; f++)
							{
								// поиск id массива предметов, относительно номера объекта
								n = allItems[f].name.Split(new char[] {'_'}, StringSplitOptions.RemoveEmptyEntries)[0];
								if(n == i.ToString()) itemCoumt = f;
							}
						}
					}
				}
			}
			else
			{
				if(!Input.GetMouseButton(0) && grid_id == -1) Reset();
			}
		}
		else
		{
			if(!Input.GetMouseButton(0) && grid_id == -1) Reset();
		}

		if(Input.GetMouseButtonUp(0) && grid_id > -1 && tmpTexture)
		{
			foreach(GameObject obj in cell)
			{
				GameObject tmp = obj.transform.GetChild(0).gameObject;

				// меняем местами иконки, внутри рюкзака
				if(tmp.GetComponent<Grid>().ID == grid_id && tmp.GetComponent<Grid>().active && cell_tmp) 
				{
					cell_tmp.GetComponent<Grid>().icon_id = tmp.GetComponent<Grid>().icon_id;
					cell_tmp.GetComponent<Grid>().item_id = tmp.GetComponent<Grid>().item_id;
					cell_tmp.GetComponent<Grid>().active = true;
					cell_tmp.GetComponent<Image>().sprite = itemIcon[tmp.GetComponent<Grid>().icon_id];

					tmp.GetComponent<Grid>().item_id = itemCoumt;
					tmp.GetComponent<Grid>().icon_id = iconCoumt;
					tmp.GetComponent<Grid>().active = true;
					tmp.GetComponent<Image>().sprite = itemIcon[iconCoumt];

					Reset();
				}

				// добавление новой иконки в инвентарь
				if(tmp.GetComponent<Grid>().ID == grid_id && !tmp.GetComponent<Grid>().active) 
				{
					tmp.GetComponent<Grid>().item_id = itemCoumt;
					tmp.GetComponent<Grid>().icon_id = iconCoumt;
					tmp.GetComponent<Grid>().active = true;
					tmp.GetComponent<Image>().sprite = itemIcon[iconCoumt];
					Destroy(tmpObject);
				}
			}
			Reset();
		}

		if(Input.GetMouseButtonDown(0) && grid_id > -1 && !tmpTexture)
		{
			foreach(GameObject obj in cell)
			{
				GameObject tmp = obj.transform.GetChild(0).gameObject;

				// выбор иконки из рюкзака
				if(tmp.GetComponent<Grid>().ID == grid_id && tmp.GetComponent<Grid>().active) 
				{
					cell_tmp = tmp;
					iconCoumt = tmp.GetComponent<Grid>().icon_id;
					itemCoumt = tmp.GetComponent<Grid>().item_id;
					tmp.GetComponent<Grid>().active = false;
					tmpTexture = tmp.GetComponent<Image>().sprite.texture;
					tmp.GetComponent<Image>().sprite = background;
				}
			}
		}
	}

	void OnGUI () 
	{
		if(tmpTexture)
		{
			// перемещение иконки на экране
			Vector2 mousePos = Event.current.mousePosition;
			GUI.depth = 999; // поверх остальных элементов
			float shift = iconSize / 2;
			GUI.Label(new Rect(mousePos.x - shift, mousePos.y - shift, iconSize, iconSize), tmpTexture);
		}
	}
}
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
TheTalion
@TheTalion
Можно сделать, чтобы появлялся в коллайдере, но вам как-то нужно выбирать необходимый коллайдер, например:

void OnTriggerStay(Collider _col)
{
if (_col.tag == "point")
{
GameObject clone = Instantiate(allItems[itemCoumt].gameObject, _col.gameObject.transform.position, Quaternion.identity);
}
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Если я правильно понял, по нажатию кнопки в инвентаре вы хотите что-то спавнить в одной конкретной точке? Внутри метода Reset у вас вызывается Instantiate с параметром curPos, просто поменяйте curPos на что-то другое и всё.
P. S. Называть метод Reset - плохая идея, это зарезервированное ключевое слово юнити, наряду с Update и Awake.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы