Я хотел бы указать кое-что о вашем коде:
Хорошей практикой при объявлении переменных является использование lowerCamelCase:
thisIsLowerCamelCase
ThisIsNot
Это соглашение об именах переменных, которое широко используется впрограммирование для дифференциации Methods and Classes
от variables
.
Еще одна вещь, которую я заметил, состоит в том, что ваша переменная "Money" равна static
, и она все еще обновляется в вашей CoinController
.Я бы установил эту переменную как частную переменную int и использовал бы ее для установки.Имея это в виду ... Вы пытались использовать Debug.Log, чтобы проверить, запускается ли OnTriggerEnter дважды, прежде чем объект будет уничтожен?
Просто напишите:
Debug.Log ("This should only happen once!");
И сыграйтеигра.Если ваша консоль показывает это сообщение два раза, этот триггер вызывается дважды.Еще одна вещь, которую вы можете заметить, это то, что вы вызываете метод Value ()
после того, как вы вызвали Destroy (transform.gameObject)
.
. Я бы сделал что-то вроде:
public class CoinController : MonoBehaviour{
private int moneyValue = 15;
private EconomyController economyController;
void Start (){
economyController = FindObjectOfType (typeof (EconomyController)) as EconomyController;
}
void OnTriggerEnter (Collider col) {
if (col.CompareTag("Player")) {
AddValue();
}
}
public int AddValue() {
EconomyController.money += moneyValue; //Option one.
EconomyController.AddMoney (moneyValue) ; //Option two.
DestroyGameObject ();
}
private void DestroyGameObject (){
Destroy(transform.gameObject);
}
}
Используя принципы чистого кодаопция 2 использует публичную функцию void, созданную внутри класса EconomyController, изменяя частную переменную.