an instance of an object
DriftManager.ManageUI () (at Assets/Drift Physics/DriftManager.cs:111)
DriftManager.Update () (at Assets/Drift Physics/DriftManager.cs:44)
Что то, что ты пытаешься вызвать равно null
Дрифт менеджер глянь Там ссылок не хватает
В классе DriftManager в Update в строке 44 вызывается ManageUI, где в строке 111 используется поле с нулевым значением. Загляни туда и сделай так, чтобы значение определялось до использования.
Как это сделать?
Загляни в ManageUI 111 строку.
И посмотри что там вызывается.
currentScoreText.text=currentScore.ToString("###,###,000")
Значит currentScoreText = null в момент вызова. Когда ему назначается экземпляр, в старте?
using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using System.Threading.Tasks; public class DriftManager : MonoBehaviour { public Rigidbody playerRB; public TMP_Text totalScoreText; public TMP_Text currentScoreText; public TMP_Text factorText; public TMP_Text driftAngleText; private float speed=0; private float driftAngle=0; private float driftFactor=1; private float currentScore; private float totalScore; private bool isDrifting = false; public float minimumSpeed = 5; public float minimumAngle = 10; public float driftingDelay = 0.2f; public GameObject driftingObject; public Color normalDriftColor; public Color nearStopColor; public Color driftEndedColor; private IEnumerator stopDriftingCoroutine = null; // Start is called before the first frame update void Start() { driftingObject.SetActive(false); } // Update is called once per frame void Update() { ManageDrift(); ManageUI(); } void ManageDrift() { speed = playerRB.velocity.magnitude; driftAngle = Vector3.Angle(playerRB.transform.forward, (playerRB.velocity + playerRB.transform.forward).normalized); if (driftAngle > 120) { driftAngle = 0; } if (driftAngle >= minimumAngle && speed > minimumSpeed) { if(!isDrifting||stopDriftingCoroutine!=null) { StartDrift(); } } else { if (isDrifting && stopDriftingCoroutine == null) { StopDrift(); } } if (isDrifting) { currentScore += Time.deltaTime * driftAngle * driftFactor; driftFactor += Time.deltaTime; driftingObject.SetActive(true); } } async void StartDrift() { if (!isDrifting) { await Task.Delay(Mathf.RoundToInt(1000 * driftingDelay)); driftFactor = 1; } if (stopDriftingCoroutine != null) { StopCoroutine(stopDriftingCoroutine); stopDriftingCoroutine = null; } currentScoreText.color = normalDriftColor; isDrifting = true; } void StopDrift() { stopDriftingCoroutine = StoppingDrift(); StartCoroutine(stopDriftingCoroutine); } private IEnumerator StoppingDrift() { yield return new WaitForSeconds(0.1f); currentScoreText.color = nearStopColor; yield return new WaitForSeconds(driftingDelay * 4f); totalScore += currentScore; isDrifting = false; currentScoreText.color = driftEndedColor; yield return new WaitForSeconds(0.5f); currentScore = 0; driftingObject.SetActive(false); } void ManageUI() { totalScoreText.text = "Total: " + (totalScore).ToString("###,###,000"); factorText.text = driftFactor.ToString("###,###,##0.0")+"X"; currentScoreText.text=currentScore.ToString("###,###,000"); driftAngleText.text=driftAngle.ToString("###,##0") + "°"; } }
Вместо TMP_Text используй TextMeshProUGUI и определи все переменные в инспекторе.
Ок, надеюсь сработает, спасибо
Обсуждают сегодня