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

Unity开发:如何初始化直接引用属性的变量?实现变量与属性同步修改

解决Unity跨脚本修改布尔变量的问题

直接给你几个可行的Unity常用解决方案:

1. 直接访问并修改原成员变量

先确保playerHealth脚本里的isDamagable是public(如果不想让它在代码里公开但要在Inspector可见,也可以用[SerializeField],但跨脚本修改用public更直接):

// playerHealth脚本内
public bool isDamagable = true;

然后在"turn invisible"脚本里,不要把值复制给新变量,直接获取组件后修改原变量:

// "turn invisible"脚本内
playerHealth healthComponent = GetComponent<playerHealth>();
if (healthComponent != null) // 加空判断避免空引用报错
{
    healthComponent.isDamagable = false; // 直接操作原变量,而非副本
}

你之前的代码问题在于把isDamagable的值拷贝到了新变量isDamagable01里,修改新变量自然不会影响原脚本的变量,直接操作组件的成员变量就能解决这个问题。

2. 封装成属性(推荐用于需要控制逻辑的场景)

如果不想把变量直接暴露为public,或者以后要在赋值时加额外逻辑(比如日志、状态校验),可以用属性封装:

// playerHealth脚本内
private bool _isDamagable = true;

public bool IsDamagable
{
    get => _isDamagable;
    set 
    {
        _isDamagable = value;
        // 这里可以加额外逻辑,比如赋值时打印日志:
        // Debug.Log($"可攻击状态已修改为:{value}");
    }
}

然后在"turn invisible"脚本里通过属性赋值:

playerHealth healthComponent = GetComponent<playerHealth>();
if (healthComponent != null)
{
    healthComponent.IsDamagable = false;
}

3. 写专门的设置方法(适合需要联动其他逻辑的场景)

如果修改isDamagable时需要触发其他操作(比如隐身时播放动画、触发无敌特效),可以写一个专门的方法:

// playerHealth脚本内
public bool isDamagable = true;

public void SetDamagableStatus(bool newStatus)
{
    isDamagable = newStatus;
    // 这里可以加联动逻辑,比如:
    // if (!newStatus) PlayInvisibilityEffect();
}

然后在"turn invisible"脚本里调用这个方法:

playerHealth healthComponent = GetComponent<playerHealth>();
if (healthComponent != null)
{
    healthComponent.SetDamagableStatus(false);
}

注意事项

  • 确保GetComponent<playerHealth>()能正确获取组件:如果两个脚本不在同一个GameObject上,可换成GameObject.Find("Player").GetComponent<playerHealth>()(或在Inspector里手动赋值组件引用,更高效)。
  • 空判断能避免找不到组件时出现空引用异常。

内容的提问来源于stack exchange,提问作者Mohammad io

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:53:29