You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity新手求助:如何在两个不同脚本中共享布尔变量

Unity跨脚本访问变量的正确方法(解决IsAlive同步问题)

你的代码问题出在两个地方:

  1. 字段初始化阶段引用未赋值:PlayerScript_logic是需要在Inspector拖入或运行时获取的组件引用,而IsAlive_logic的初始化代码在Unity完成组件引用赋值前就执行了,直接访问会触发空引用错误。
  2. 值不会实时同步:就算引用赋值成功,IsAlive_logic只是复制了IsAlive的初始值,之后Player里的IsAlive变化时,这个变量不会自动更新。

下面给你三种实用的解决方法,按需选择:

方法1:实时直接访问(最常用)

直接在需要检查的逻辑里访问Player的IsAlive,保证每次拿到的都是最新值:

public class LogicScript : MonoBehaviour
{
    // 在Inspector面板把挂载PlayerScript的Player对象拖到这个字段上
    public PlayerScript playerScript;

    // 举个例子:在Update里实时检查状态
    private void Update()
    {
        // 先判空,避免没拖对象或者Player被销毁时报错
        if (playerScript != null && playerScript.IsAlive)
        {
            // 玩家存活时执行的操作
            Debug.Log("玩家存活中,执行逻辑");
        }
        else
        {
            // 玩家死亡后的操作
            Debug.Log("玩家已死亡,停止逻辑");
        }
    }

    // 如果不想手动拖引用,也可以在Awake里自动查找
    private void Awake()
    {
        // 查找场景中唯一的PlayerScript组件(场景里只有一个Player时用)
        playerScript = FindObjectOfType<PlayerScript>();
    }
}

方法2:用属性封装(更优雅的实时访问)

把Player的状态封装成属性,每次访问都会实时获取最新值:

public class LogicScript : MonoBehaviour
{
    public PlayerScript playerScript;

    // 封装成属性,自动判空并返回最新状态
    private bool IsPlayerAlive
    {
        get 
        { 
            return playerScript != null && playerScript.IsAlive; 
        }
    }

    private void Update()
    {
        if (IsPlayerAlive)
        {
            // 执行存活逻辑
        }
    }
}

方法3:事件通知(适合单次触发场景)

如果只需要在玩家死亡时执行一次操作(比如显示游戏结束UI),用事件通知更高效,不需要一直轮询状态:

修改PlayerScript:

using System;
using UnityEngine;

public class PlayerScript : MonoBehaviour
{
    public bool IsAlive = true;
    // 定义死亡事件,所有需要监听的脚本都能订阅
    public event Action OnPlayerDeath;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (IsAlive)
        {
            IsAlive = false;
            // 触发事件,通知所有订阅者
            OnPlayerDeath?.Invoke();
        }
    }
}

修改LogicScript:

using UnityEngine;

public class LogicScript : MonoBehaviour
{
    public PlayerScript playerScript;

    private void Awake()
    {
        playerScript = FindObjectOfType<PlayerScript>();
        // 订阅死亡事件
        playerScript.OnPlayerDeath += HandlePlayerDeath;
    }

    // 玩家死亡时触发的方法
    private void HandlePlayerDeath()
    {
        Debug.Log("玩家死亡,执行游戏结束逻辑");
        // 比如显示游戏结束面板、暂停游戏等
    }

    // 销毁时取消订阅,避免内存泄漏
    private void OnDestroy()
    {
        if (playerScript != null)
        {
            playerScript.OnPlayerDeath -= HandlePlayerDeath;
        }
    }
}

注意事项

  • 永远不要在字段初始化阶段访问其他组件的变量,Unity的组件引用要在Awake/Start生命周期方法里赋值或访问。
  • 访问外部组件前一定要判空,避免空引用异常。
  • 如果场景中有多个Player,不要用FindObjectOfType,改用标签查找:GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerScript>(),记得给Player对象设置对应标签。

内容的提问来源于stack exchange,提问作者Dorian Lambin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:35:28