2017-02-03 2 views
1

Итак, у меня есть карта в моей игре, разбитая на разные области. Каждый из них состоит из отдельного массива в массиве Area. В настоящее время я нахожусь в состоянии щелкнуть по объекту. Когда игрок нажимает на объект в игре, часть карты, на которую он нажимает, должна вытащить определенную сумму, и когда он нажимает на другую часть, часть которой должна появиться, а другая должна вернуться к исходной позиции. В настоящее время я уничтожаю этот объект, когда я нажимаю на него, но он даже не будет выбран в игре.Нажав на объект

using UnityEngine; 
using System.Collections; 

public class AreaSelection : MonoBehaviour { 
public GameObject[] Areas; 

void Start() 
{ 
    Areas = new GameObject[20]; 
} 
void Update() 
{ 
} 
void OnMouseDown() 
{ 
    Destroy(this.gameObject); 
} 
+0

Что вы пытаетесь сделать с массивом GameObject? Поскольку это общедоступная переменная, она будет сериализована, и я предполагаю, что вы собираетесь разместить свои другие области. Вам не нужно инициализировать его (Areas = new GameObject [20];). Кроме того, каждый район будет содержать все другие районы? Для чего? Разве не лучше, что есть какой-то AreaManager, который контролирует и содержит все области? – Maakep

ответ

3

«OnMouseDown вызывается, когда пользователь нажал кнопку мыши над GUIElement или коллайдере.»

- Documentation

Это означает, что вам нужен коллайдер на GameObject, что этот сценарий присоединен. OnMouseDown будет запускаться только в GameObject, к которому он привязан. Поэтому, если у вас есть этот скрипт на каком-то менеджере, у которого нет коллайдера или размер или что-то еще, вы не сможете использовать OnMouseDown. Если вы хотите, чтобы пойти другой маршрут, который я вроде рекомендую, вы бы переместить логику метода Update() вроде этого:

(от 2d-проекта шахты) `` `

RaycastHit2D hit; 
public LayerMask mask; 
Vector2 mousePos; 
GameObject selectedObject; 


void Update() { 

    // If mouse left click is pressed 
    if (Input.GetMouseButtonDown(0)) { 
     mousePos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition); 
     hit = Physics2D.Raycast(mousePos, Vector2.zero, mask); 

     if (hit.collider != null) 
     { 
      selectedObject = hit.collider.gameObject; 
     } 
    } 
} 

Обратите внимание, что вы должны установить публичную LayerMask в инспекторе, чтобы поразить только объекты, которые хотите поразить.

С помощью этого скрипта вы можете отправить Raycast со своего экрана по направлению к мыши и, если он попадет в любой GameObject с выбранным слоем в LayerMask, он поместит этот объект в SelectedObject (и как только у вас появится игровой объект может делать с вами все, что вы хотите).

+0

Должен ли я поставить коллайдер на каждый объект или, если бы у меня был объект игры, в котором были бы все объекты карты, такие как папка, я мог бы просто вставить этот объект и сделать это. –

+0

@MadushaSilva, очевидно, если вы помещаете коллайдер на объект, только скрипты, прикрепленные к этому объекту, получают событие OnMouseDown – Bijan

+0

. Я обновил ответ с более обширным и практичным примером идеи сделать это. – Maakep

Смежные вопросы