2017-01-20 18 views
0

Я только что выпустил свою первую игру с ужасом инди, несколько дней назад, и я в процессе ее обновления. В моей игре цель состоит в том, чтобы активировать несколько генераторов, чтобы восстановить силу и избежать. Я хочу сделать игру более реалистичной, поэтому я добавляю бензиновые канистры, которые можно использовать для активации генераторов. Мне нужна помощь в создании сценария, который позволяет игроку собирать газовые баллончики и использовать их для активации генераторов. Вот то, что я до сих пор:Destroy pickup object OnMouseDown

public class GasCanisters : MonoBehaviour 

public GameObject Player; 
public GameObject[] GasCanisters; 
public AudioClip PickupSound; 

void Update() 
{ 
AudioSource.PlayClipAtPoint(PickupSound, transform.position); 

    if (Input.GetMouseButtonDown(0)) 
     { 
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
      RaycastHit hit; 
      if (Physics.Raycast(ray, out hit)) 
      { 
       if (hit.collider.CompareTag("Gas Canister")) 
    GameObject.Destroy(gameObject); 
       } 
} 

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

+5

Что вопрос? На данный момент у нас очень смутное представление о том, что вы просите :) - что-то не работает? – Charleh

+1

Единственное, что я могу заметить до сих пор, это то, что 'gameObject' (в последней строке) не определено. Возможно, вы имели в виду «Player» (который должен, возможно, начинаться с строчной буквы, поскольку это * не * конструктор класса, а переменная). – hlfrmn

+1

@hlfrmn gameObject не является неопределенным, когда вы вводите gameObject в скрипте в единстве, он будет ссылаться на объект gameObject, к которому прикреплен скрипт, который унаследован от MonoBehaviour. – Eddge

ответ

1

ОК, здесь есть что поделать; во-первых, не используйте Update, который запускает каждый кадр независимо от того, находится ли ваш плеер на расстоянии 1 метра или 200 миль от контейнера, который отнимает много процессорного времени. Вместо этого используйте OnMouseOver. Убедитесь, что вы есть collider на вашем баллоне затем добавить скрипт что-то вроде:

void OnMouseOver() 
{ 
    if(Input.GetButtonDown) 
    { 
     transform.SetParent(yourPlayersHand.transform); 
     transform.localPosition = Vector3.Zero; 
     transform.localRotation = Quaterion.Identity; 
    } 
} 

Это будет «прикрепить» канистру к вашим игрокам руки. Возможно, вам захочется поиграть с позицией &, чтобы она выглядела правильно.

Во-вторых, вам нужно каким-то образом определить контейнер, самым простым способом было бы добавить tag.

Далее добавьте аналогичный сценарий к генератору, чтобы делать то, что вы хотите, что-то вроде:

void OnMouseOver() 
{ 
    if(Input.GetButtonDown) 
    { 
     if(yourPlayersHand.transform.GetChild(0).tag == "canister") 
     { 
      // your code for what happens 
     } 
    } 
}