← Kembali ke blog

Editor Berfungsi, Binaan Gagal: Jejak Ralat Konsol ke Rujukan Skrip dan Adegan dengan Unity MCP

Apabila Unity Play berfungsi tetapi binaan Player/peranti gagal atau NRE pada muat adegan: lapisan A/B/C, gunakan Cursor + Unity MCP untuk membaca Konsol, sahkan Tetapan Binaan dan rujukan bersiri—dengan sampel tindanan, pemeriksaan manual, dan pembaikan minimum.

Diterbitkan
  • Unity MCP
  • Unity
  • Console
  • build
  • Android
  • Cursor
  • troubleshooting
  • AI game development

Benang bertajuk “Unity berfungsi dalam editor, gagal pada peranti / binaan” kelihatan sama: Play berfungsi, kemudian binaan Player / peranti menjadi merah, ranap, skrin hitam, atau membuang NullReferenceException apabila memasuki adegan. Enjin jarang “rosak”—laluan editor menyembunyikan jurang rujukan dan platform: adegan tidak dalam senarai binaan, medan bersiri yang None pada cakera, sensitiviti huruf besar/kecil laluan, atau API UnityEditor bocor ke dalam pemasangan runtime sehingga masa pembungkusan.

Catatan ini mempunyai tiga tunjang (sama seperti tajuk):

  1. Konsol / tindanan → objek skrip dan adegan
  2. Sahkan Tetapan Binaan, Skrip Hilang, rujukan bersiri
  3. Diagnosis baca-sahaja dalam Cursor melalui Unity MCP → pembaikan minimum selepas anda sahkan

Tiada panduan pemasangan plugin, tiada panduan penghantaran kedai penuh. Pelucutan IL2CPP dan plugin asli kekal dalam lampiran.

Berkaitan:

Pertama: lapisan mana yang gagal?

A. Tetingkap Binaan merah (kegagalan kompilasi / pembungkusan)
        ↓
B. Binaan berjaya; peranti mati atau skrin hitam semasa pelancaran
        ↓
C. Permainan bermula; adegan atau ciri meletup pada runtime
Apa yang anda lihatLapisanSemak dahulu di sini
Binaan gagal, error CS… / jenis tidak ditemuiAPemasangan runtime merujuk UnityEditor, #if buruk, asmdef
NRE / MissingReference pada adegan bootB/CAdegan dalam senarai binaan, Skrip Hilang, None dalam Inspector
Hanya gagal pada Resources.Load / adegan tambahanCKes huruf laluan, aset dalam pek, adegan sebenarnya dimuatkan

Unity MCP paling kuat pada editor terbuka: Konsol, Hierarki, medan komponen. Tindanan peranti logcat / Xcode mesti ditampal ke dalam Cursor—atau hantar Binaan Pembangunan dan hasilkan semula dengan adegan boot yang sama dalam Editor apabila boleh.

Gelung penyelesaian masalah (manual + MCP)

Jangan langkau laluan manual dan minta AI menulis semula Player.

Langkah 0: Bekukan adegan dengan tangan (~2 minit)

Sebelum Cursor:

  1. Catat versi Unity dan sasaran (cth. Android / IL2CPP)
  2. Kosongkan Window → General → Console, kemudian Bina atau Binaan Pembangunan sekali
  3. Salin Ralat pertama yang berkaitan (dengan tindanan)—bukan dinding Amaran
  4. Buka File → Build Settings: adakah adegan yang disyaki ditandakan? Adakah indeks 0 ialah adegan boot?
  5. Jika anda mengedit contoh Prefab: adakah anda Apply? Penggantian tidak digunakan selalunya tidak pernah mencapai aset cakera yang anda fikir anda hantar

Langkah 1: Triage Konsol baca-sahaja MCP

Ringkaskan Ralat Konsol yang berkaitan dengan binaan ini / Play terakhir (abaikan Info).
Klasifikasikan sebagai kompilasi / Skrip Hilang / NullReference / muat sumber.
Senaraikan laluan skrip, baris, nama GameObject setiap ralat apabila ada.
Jangan ubah suai sebarang aset.

Langkah 2: Manual + MCP “trio rujukan”

Untuk NRE runtime (B/C), pilih objek tindanan dalam editor dan semak silang dengan MCP:

ManualPrompt MCP
Senarai Tetapan Binaan (screenshot atau imlak)“Senaraikan laluan adegan Build Settings dan bendera didayakan; namakan adegan boot.”
Inspector: Skrip Hilang / rujukan None”Dalam adegan <Nama>, senaraikan Skrip Hilang; semak medan bersiri pada <Objek>.<Komponen> untuk None. Jadual sahaja. Jangan edit.”
Aset Prefab vs contoh adegan”Adakah <X> aset Prefab atau contoh adegan? Sebarang penggantian tidak digunakan jika kelihatan? Laporkan sahaja.”

Peraturan: Pek menggunakan adegan/Prefab pada cakera. Pengisian sementara OnValidate yang “kelihatan baik” dalam Editor tidak dikira—percayai nilai bersiri daripada MCP/Inspector.

Langkah 3: Templat diagnosis, kemudian sahkan

[Kekangan]
- Diagnosis dan cadangkan pelan minimum; tunggu OK saya sebelum mengedit
- Jangan palsukan pembaikan dengan GameObject.Find secara besar-besaran
- Sentuh hanya skrip/Prefab/adegan yang berkaitan dengan Ralat ini

[Adegan]
- Editor Play: OK / rosak (jujur)
- Platform / binaan: …
- Adegan boot Build Settings: …
- Tindanan Konsol / peranti (mentah):
<tampal>

[Jawapan]
1. Lapisan A / B / C
2. 1–2 punca utama (tidak dalam binaan / rujukan None / Skrip Hilang / kes / API Editor…)
3. Objek dan nama medan yang perlu saya sahkan
4. Langkah pembaikan minimum (masih jangan laksanakan)

Langkah 4: Tulis minimum + semak semula

Terapkan pembaikan minimum yang disahkan: hanya <objek.medan> atau beberapa baris dalam <laluan skrip> untuk Ralat ini.
Simpan adegan/Prefab.
Kemudian semak semula baca-sahaja: medan masih None? Ralat yang sama masih dalam Konsol?

Contoh kerja: tindanan → medan

Log Player/peranti sintetik tetapi realistik (tukar laluan untuk projek anda).

Log

NullReferenceException: Object reference not set to an instance of an object
  at HudHealthView.HandleHealthChanged (System.Single current, System.Single max) [0x00000] in Assets/Scripts/UI/HudHealthView.cs:42
  at PlayerHealth.TakeDamage (System.Single amount) [0x00000] in Assets/Scripts/Combat/PlayerHealth.cs:28
  at DebugDealDamage.Update () [0x00000] in Assets/Scripts/Debug/DebugDealDamage.cs:15

Lapisan

  • Mencapai Update → bukan A (kompilasi OK)
  • Mati apabila menerima kerosakan → C (runtime); syak rujukan UI, bukan “tulis semula pertempuran”

Manual

  1. Adakah adegan HUD dalam Tetapan Binaan?
  2. Pilih objek HudHealthView; adakah healthFill / playerHealth None?
  3. Suntingan Prefab: Applied?

MCP

Baca-sahaja: buka adegan yang mengandungi HUD.
1. Cari objek dengan HudHealthView
2. Laporkan sama ada healthFill, playerHealth (dan rakan sebaya) adalah None / Hilang
3. Jangan edit
Jika None: pelan minimum ialah tetapkan semula rujukan dan simpan—bukan ubah TakeDamage.

Pembaikan minimum (selepas OK)

  • Seret Imej HUD_HealthFill → healthFill; PlayerHealth pemain → playerHealth
  • Simpan; Binaan Pembangunan; terima kerosakan sekali lagi

”Pembaikan” buruk (jangan)

// Anti-corak: Find menyembunyikan None — masih rosak pada rename / muat tambahan
healthFill = GameObject.Find("HUD_HealthFill").GetComponent<Image>();

Pendawaian betul: HUD → peristiwa kesihatan. Di sini: pin medan daripada tindanan, kemudian ikat semula.

Matriks gejala (tunjang)

Gejala 1: Binaan merah — jenis tidak ditemui / UnityEditor

Punca berkemungkinanManualMCP
Skrip runtime menggunakan API EditorAdakah fail di luar Editor/?”Cari UnityEditor. di luar folder Editor; senaraikan laluan sahaja.”
#if terbalik, jenis Player hilangSemak UNITY_EDITOR membungkus”Jenis mana yang wujud di bawah Editor vs Player untuk fail ini?”
Jurang asmdefBuka .asmdef yang gagal”Senaraikan rujukan asmdef; yang mana hilang?”

Anti-corak (API Editor dalam pemasangan runtime → binaan Player gagal):

using UnityEngine;
using UnityEditor; // Gagal binaan jika bukan pemasangan Editor

public class BadBake : MonoBehaviour
{
    [MenuItem("Tools/Bad")] // kebergantungan UnityEditor selanjutnya
    static void Run() { }
}

Pembaikan A: seluruh fail di bawah Editor/

Assets/Scripts/Editor/BakeTools.cs   ← kompilasi khusus editor

Pembaikan B: asingkan dalam fail (hanya jika anda mesti kongsi fail)

using UnityEngine;

public class RuntimeSafe : MonoBehaviour
{
    public void DoGameplay() { /* kelihatan kepada Player */ }

#if UNITY_EDITOR
    [ContextMenu("Debug/Fill Refs")]
    void EditorOnlyFill()
    {
        // Editor sahaja — jangan anggap ini sebagai data runtime yang dibungkus dari Awake
    }
#endif
}

Lebih bersih: skrip khusus Editor + asmdef supaya pemasangan runtime tidak pernah menarik rujukan Editor.

Gejala 2: NRE peranti pada masuk adegan; Editor Play “nampak baik”

Semak mengikut urutan—tiada penulisan semula mega selari:

  1. Adegan tidak dalam Tetapan Binaan atau adegan boot salah
  2. Skrip Hilang / None bersiri (termasuk Prefab tidak digunakan)
  3. Adegan tambahan tidak dimuatkan sebelum Find / akses
  4. Kes huruf laluan Resources.Load (Editor macOS selalunya tidak sensitif huruf; Android tidak)
1. Laporkan adegan Build Settings, bendera didayakan, indeks boot
2. Senaraikan semua Skrip Hilang dalam adegan <X>
3. Semak rujukan awam pada GameManager / Player / HUD sepanjang laluan boot untuk None
Laporkan sahaja; jangan edit.
Dalam EditorDalam pekPunca biasa
Rujukan kelihatan ditetapkanNone runtimePenggantian contoh tidak digunakan; fail adegan salah diedit
Find berfungsiNull perantiObjek dalam adegan tidak dimuatkan; nama tidak sepadan
Resources.Load berfungsiNull perantiKes huruf laluan; aset tidak di bawah Resources/
// Pada cakera: Assets/Resources/UI/HealthBar.png
// Selalunya gagal pada Android (kes huruf tidak sepadan):
Resources.Load<Sprite>("ui/healthbar");
// Padankan laluan di bawah Resources, cth.:
Resources.Load<Sprite>("UI/HealthBar");
Cari rentetan laluan Resources.Load / Addressables.LoadAssetAsync;
bina jadual sensitif huruf vs laluan relatif sebenar. Jangan edit kod lagi.

Gejala 3: Konsol dibanjiri Skrip Hilang

Imbas adegan <X> dan Prefab <laluan>:
Senaraikan laluan GameObject dengan Skrip Hilang.
Setiap item: cadangkan lampirkan semula skrip asal atau buang komponen kosong (dari nama/GUID yang tinggal jika kelihatan).
Jangan padam pukal secara automatik.

Manual: sahkan fail skrip masih wujud dan asmdef/GUID tidak rosak; sahkan satu demi satu sebelum memadam kosong.

Senarai semak penerimaan

  1. Ralat yang sepadan hilang daripada Konsol
  2. Editor Play berjalan melalui laluan yang sama yang gagal (masuk tahap, terima kerosakan, buka UI…)
  3. Satu Binaan Pembangunan ke sasaran (atau Player tempatan)
  4. MCP semak semula baca-sahaja: medan yang disyaki tidak lagi None / Hilang
  5. Git diff hanya perubahan kecil adegan/Prefab/skrip yang dijangkakan—tiada refaktor sampingan
Semak semula baca-sahaja: sebarang None atau Skrip Hilang pada <senarai objek>? Senaraikan pengecualian. Jangan edit.

Garis merah prompt

JanganLakukan
”Buat Play berfungsi sahaja”Lapisan A/B/C + pin medan daripada tindanan
Find besar-besaran dan bukannya rujukanBetulkan medan bersiri atau suntikan eksplisit
Susun semula Tetapan Binaan tanpa dimintaLaporkan senarai semasa dan adegan boot dahulu
”Ada NRE”Tampal 20–40 baris tindanan pertama

Sempadan produk

  • Unity MCP: Konsol editor, Hierarki, skrip, rujukan—tunjang artikel ini.
  • AI Studio: Struktur UI ke dalam enjin; ikat semula selepas eksport semula mengikut catatan pendawaian—jangan cari UI daripada permainan.
  • Sijil, kedai, ROM OEM: tampal teks log ke dalam Cursor untuk bantuan membaca; di luar skop edit adegan MCP.

Lampiran: biasa tetapi di luar tunjang

Ketepikan tunjang artikel ini dahulu:

GejalaArah
Pembangunan OK, Keluaran matiManaged Stripping / link.xml; MCP: “Teka jenis dilucutkan daripada tindanan ranap; cadangkan link.xml; jangan tulis fail lagi.”
Ranap asli Android (tidak terurus).so / kebenaran / Gradle; tampal logcat untuk membaca
API Unity di luar benang utamaSemak panggilan balik async kembali ke benang utama

Jangan gabungkan stripping dan Skrip Hilang menjadi satu “penulisan semula besar.”

  1. Editor OK / pek rosak → anggap rujukan / adegan dalam binaan / laluan / API Editor dahulu
  2. Manual bekukan Tetapan Binaan + Ralat pertama, kemudian triage baca-sahaja MCP
  3. Tindanan → baris skrip → medan komponen; ikat semula atau buang komponen kosong selepas sahkan
  4. Tiada Find atau penulisan semula permainan sebagai pembaikan palsu
  5. Terima dengan Binaan Pembangunan + semak semula baca-sahaja

Jalankan “bekukan → lapisan → trio rujukan → pin medan seperti sampel” dan kebanyakan pepijat rujukan peranti mengecil kepada diff kecil yang boleh disemak.

Panduan lain yang mungkin anda suka