У вас две проблемы.
1) Свойства private
, что означает, что они не видны другим классам. Видимость по умолчанию для полей является личной .
2) Свойства отсутствуют в сценарии, прикрепленном к вашему префабу.
Исправление # 2 (как предполагает Soraphis) - это своего рода , что нужно сделать, однако вы захотите удалить поле public GameObject preFabFood;
из вашего FOODS
класса, если вы присоединяете FOODS
класс для готового экземпляра (так как вам не нужно переносить копию экземпляра объекта с экземпляром). Просто помните об этом, когда вы корректируете свой код (код, который вы разместили, выглядит как один скрипт, но я подозреваю, что он должен быть больше одного, а на самом деле должен быть как минимум 2).
Что касается исправления # 1, вы должны сделать их общедоступными или получить к ним доступ из того же сценария. Если вы напрямую присоединяете свой класс FOODS
к своему созданному префабу и что класс FOODS
содержит метод OnCollisionEnter2D
, то все в порядке.
Но, как я подозреваю, у вас есть два классов, которые вы здесь показываете, вам нужно сделать это:
public int health;
public int calories;
public float height;
public float width;
А затем используйте GetComponent()
вызов, чтобы получить один скрипт от другого. например, * * одна тысяча тридцать две
FOODS foods = this.gameObject.GetComponent<FOODS>(); //gets the FOODS script attached to this game object.
//Functionally identical to GetComponent<FOODS>();
int hp = foods.health; //etc
Обратите внимание, что вы должны вызывать GetComponent
как можно меньше, потому что он имеет ненулевые накладные расходы, поэтому кэшируйте результат как можно скорее (например, вы можете сделать это в Start()
вместо каждого раза вверху) OnCollisionEnter2D
), но это скорее общий флаг "быть осторожным", так как чрезмерное использование может вызвать проблемы с частотой кадров.