Unity预制体Slider修改值触发UnassignedReferenceException问题
Let's break down your problem and fix that frustrating error step by step. First, let's clarify why you're seeing:
UnassignedReferenceException: The variable displayslider of Manager has not been assigned. You probably need to assign the displayslider variable of the Manager script in the inspector.
This error pops up because your displayslider GameObject reference is null when the Displayselect() method runs. Here are the most likely reasons:
GameObject.Find("displayslider")only searches the root level of your scene. If your slider is nested under a Canvas/Panel (which it almost certainly is), this call won't locate it.- If your slider is part of a prefab,
GameObject.Find()won't find it until the prefab is instantiated in the scene. If the slider'sOnValueChangedevent fires beforeStart()runs, the reference will still be null. - String-based searches are fragile: rename the slider or tweak its hierarchy, and the find call breaks silently.
Solutions to Fix the Error
1. Assign References Directly in the Inspector (Recommended)
The most reliable fix is to skip GameObject.Find() entirely and link your components directly in the Unity Editor:
- Update your Manager script to reference components directly (instead of GameObjects):
public Slider displaySlider; // Reference to your display slider component public Slider timeGetAngleSlider; // Reference to your time angle slider component public Text displayValueText; // Reference to the display value text box public Text timeAngleText; // Reference to the time angle text box - Select your Manager GameObject in the Hierarchy, then drag each Slider and Text component from the Hierarchy into the corresponding fields in the Inspector.
2. Fix the GameObject.Find() Path (If You Must Use It)
If you want to keep using GameObject.Find(), use the full hierarchy path to your slider and add error checks:
void Start() { // Use the full path to locate nested objects displayslider = GameObject.Find("Canvas/Panel/displayslider"); TimeGetAngle = GameObject.Find("Canvas/Panel/TimeGetAngle"); // Always verify the find succeeded before using the reference if (displayslider == null) { Debug.LogError("Could not find displayslider! Double-check its hierarchy path."); return; } // Rest of your Start() code... }
3. Add Null Checks in Your Methods
Prevent crashes even if references go missing by adding safety checks in your slider methods:
public void Displayselect() { if (displayslider == null) { Debug.LogError("displayslider reference is unassigned!"); return; } display = displayslider.GetComponent<Slider>().value; displayvaluetext.text = display.ToString(); }
Optimized Manager Script Example
Here's a cleaned-up version of your script with best practices applied:
using UnityEngine; using UnityEngine.UI; public class Manager : MonoBehaviour { // Assign these directly in the Inspector public Slider displaySlider; public Slider timeGetAngleSlider; public Text displayValueText; public Text timeAngleText; public float timeAngle; public float displayValue; public static Manager instance = null; void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else if (instance != this) { Destroy(gameObject); } timeAngle = 0; displayValue = 5; } void Start() { // Initialize text with current slider values UpdateTimeAngleText(); UpdateDisplayValueText(); } // Call this from your TimeGetAngle slider's OnValueChanged event public void OnTimeGetAngleChanged() { timeAngle = timeGetAngleSlider.value; UpdateTimeAngleText(); } // Call this from your displayslider's OnValueChanged event public void OnDisplayValueChanged() { displayValue = displaySlider.value; UpdateDisplayValueText(); } // Helper methods to clean up text updates private void UpdateTimeAngleText() { timeAngleText.text = timeAngle.ToString("F2"); // Format to 2 decimal places for readability } private void UpdateDisplayValueText() { displayValueText.text = displayValue.ToString("F2"); } }
Final Notes
- When setting up the slider's
OnValueChangedevent in the Inspector, select the Manager'sOnDisplayValueChanged()(orOnTimeGetAngleChanged()) method directly—this avoids timing issues with reference assignment. - Using direct component references instead of repeated
GameObject.Find()andGetComponent()calls makes your code faster and easier to maintain.
内容的提问来源于stack exchange,提问作者Muhammad usman

