Как написать код, чтобы вычитало одну ячейку жизни?
Работаю над Баскетбол Шутером на юнити. Делаю ту часть, которая отвечает за вычитание ячеек жизни. Та часть кода, которая отвечает за добавление баллов срабатывает при касании с компонентом "Bonus" и добавляет баллы, но последующая часть кода, которая отвечает за уменьшение здоровья не срабатывает. По задумке это должно происходить после того, как мяч не попадет по объекту "Bonus" и соприкоснется с объектом "Terraine". Вопрос: Как написать код, чтобы при отсутсвии касания с Объектом "Bonus" и при последующем касании с объектом "Terraine" вычиталась ячейка жизни и объект 3hp выключался и включался объект 2hp и потом при последующем непопадания основным объектом на котором закреплен скрипт по объекту "Bonus" выключался объект 2hp и включался 1hp?
public class Ball : MonoBehaviour
{
[HideInInspector] public Rigidbody rb;
[HideInInspector] public Collider col;
[HideInInspector] public Vector3 pos { get { return transform.position;} }
public static Score instance;
public Text scoreText;
public Text bestScoreText;
public int health = 3;
public GameObject hp3;
public GameObject hp2;
public GameObject hp1;
int score = 0;
int best = 0;
void Awake ()
{
rb = GetComponent <Rigidbody> ();
col = GetComponent <Collider> ();
//instance = this;
}
private void Start ()
{
best = PlayerPrefs.GetInt("best", 0);
scoreText.text = "Score: " + score.ToString();
bestScoreText.text = "Best: " + best.ToString();
}
public void Push (Vector2 force)
{
rb.AddForce (force, ForceMode.Impulse);
}
public void ActivateRb ()
{
rb.isKinematic = false;
}
public void DesactivateRb ()
{
rb.velocity = Vector3.zero;
//rb.angularVelocity = 0f;
rb.isKinematic = true;
}
private void OnCollisionEnter (Collision collision)
{
if (collision.gameObject.name == "Terraine")
{
transform.position = new Vector3 (Random.Range(-4f, 8f), Random.Range(2f, 7f), -0.2f);
DesactivateRb();
}
}
public void OnTriggerExit (Collider other)
{
if (other.gameObject.name == "Bonus")
{
score += 2;
scoreText.text = "Score: " + score.ToString();
if(best < score)
PlayerPrefs.SetInt("best", score);
}
if (other.gameObject.name != "Bonus")
{
health = health - 1;
}
}
void Update()
{
if (health == 3)
{
hp3.SetActive (true);
hp2.SetActive (false);
hp1.SetActive (false);
}
if (health == 2)
{
hp3.SetActive (false);
hp2.SetActive (true);
hp1.SetActive (false);
}
if (health == 1)
{
hp3.SetActive (false);
hp2.SetActive (false);
hp1.SetActive (true);
}
}
}
Ответы (1 шт):
Как один из вариантов....
- Навесить на бонус тэг. Да и на террейн тоже.
- Хранить внутри мяча тэг обьекта последней коллизии. Думаю, что допустимо, даже, статическую переменную в даном случае.
- На новой коллизизи вытягивать этот тег и смотреть. Если не бонус - вычетаем жизнь.