Я не вижу ничего явно неправильного в этом, но если равно , проверка расстояния прошла неправильно, вы можете попытаться отключить всю монету и включить ее, только если они на экране.
Решение, которое будет работать со всеми разрешениями, выглядит примерно так:
private bool IsOnScreen(Vector3 worldPosition)
{
Vector3 screenPoint = camera.WorldToViewportPoint(worldPosition);
return screenPoint.x > 0
&& screenPoint.x < 1
&& screenPoint.y > 0
&& screenPoint.y < 1;
}
Отдельная проблема, которая может быть решена, заключается в том, что ваш скрипт для монет отвечает за слишком много вещей.Прямо сейчас каждая монета
- Знает, сколько монет игрок имеет и может изменить это число
- Знает и изменяет текст интерфейса для монет на старте
- отвечает за включение / отключение своих собственных компонентов, когда вы можете просто уничтожить игровой объект, когда он собран
- Находит звуковой игровой объект и воспроизводит звук
Из-за всех этих обязанностей вытруднее решать вопросы в этом классе.Подумайте о том, чтобы иметь некоторый класс CoinManager, который может отслеживать, сколько монет у игрока (вместо каждой отдельной монеты, зная о количестве монет).
Ваш класс может выглядеть примерно так
public class CoinManager : MonoBehaviour
{
private Camera camera;
[SerializeField] private AudioClip coinCollectedSound;
[SerializeField] private AudioSource audioSource;
[SerializeField] private List<CoinScript> coins;
[SerializeField] private int coinCount;
[SerializeField] private Text coinLabel;
// This could be called by some spawner class that
// adds coins to the scene
public void AddCoin(CoinScript coin)
{
coins.Add(coin);
}
public void CoinCollected(CoinScript coin)
{
Destroy(coin.gameObject);
coinCount++;
audioSource.PlayOneShot(coinCollectedSound);
// Alternatively, if you have a dedicated audio source
// for coin sounds you can just use audioSource.Play();
}
private void Update()
{
// Iterate over all the coins we know about
foreach (var coin in coins)
{
// Now that we have a method that tells us whether a
// coin is on the screen or not, we can enable and disable
// all the coins at the same time in one place
coin.transform.enabled = IsOnScreen(coin.transform.position);
}
}
private void Awake()
{
// Gets the main camera in the scene
// https://docs.unity3d.com/ScriptReference/Camera-main.html
camera = Camera.main;
coins = new List<CoinScript>();
}
private bool IsOnScreen(Vector3 worldPosition)
{
Vector3 screenPoint = camera.WorldToViewportPoint(worldPosition);
return screenPoint.x > 0
&& screenPoint.x < 1
&& screenPoint.y > 0
&& screenPoint.y < 1;
}
}
У меня нет Unity передо мной, так что вышесказанное находится на макушке моей головы.