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

Unity游戏开发:如何将整数值传递给另一个脚本?

嘿,我来帮你搞定游戏里控制类型值在脚本间传递的问题!根据你的场景,我整理了几个实用方案,你可以按需选择:

方案1:全局静态变量(最简单直接)

你已经用到了static变量,但目前每个按钮脚本都有自己的controller静态变量,这会导致冲突——三个脚本的变量是独立的,其他脚本根本不知道该读哪一个。

解决办法是把这个静态变量放到一个单独的全局管理类里,让所有按钮都修改同一个变量:

// 新建一个全局设置类,不用继承MonoBehaviour,纯静态类就行
public static class GameSettings {
    // 定义一个静态字段存储选中的控制类型:1=键盘,2=手柄,3=触屏
    public static int SelectedControllerType;
}

然后修改每个按钮的脚本,统一修改这个全局变量:

// 键盘按钮脚本
public class KeyboardButton : MonoBehaviour { 
    public void buttonClick () { 
        GameSettings.SelectedControllerType = 1; 
    } 
}

// 手柄按钮脚本
public class ControllerButton : MonoBehaviour { 
    public void buttonClick () { 
        GameSettings.SelectedControllerType = 2; 
    } 
}

// 触屏按钮脚本
public class TouchButton : MonoBehaviour { 
    public void buttonClick () { 
        GameSettings.SelectedControllerType = 3; 
    } 
}

之后,在任何需要获取这个值的脚本里,直接通过类名访问即可:

public class PlayerController : MonoBehaviour {
    void Start() {
        int selectedType = GameSettings.SelectedControllerType;
        
        // 根据值执行对应控制逻辑
        switch(selectedType) {
            case 1:
                InitKeyboardControls();
                break;
            case 2:
                InitControllerControls();
                break;
            case 3:
                InitTouchControls();
                break;
        }
    }

    // 示例控制初始化方法
    void InitKeyboardControls() { /* 键盘控制逻辑 */ }
    void InitControllerControls() { /* 手柄控制逻辑 */ }
    void InitTouchControls() { /* 触屏控制逻辑 */ }
}
方案2:Unity事件系统(低耦合,适合复杂项目)

如果不想依赖全局静态变量(比如担心全局状态混乱),可以用Unity的事件系统实现解耦的传递方式,发送方和接收方不需要直接引用彼此。

第一步,定义一个带参数的事件类型:

using UnityEngine.Events;

// 定义一个能传递int类型参数的Unity事件
[System.Serializable]
public class ControllerSelectedEvent : UnityEvent<int> { }

第二步,创建一个UI管理类,负责触发事件:

public class UIManager : MonoBehaviour {
    // 在Inspector面板里可以直接绑定接收事件的脚本
    public ControllerSelectedEvent OnControllerSelected;

    // 给键盘按钮绑定的点击方法
    public void OnKeyboardClicked() {
        OnControllerSelected?.Invoke(1);
    }

    // 给手柄按钮绑定的点击方法
    public void OnControllerClicked() {
        OnControllerSelected?.Invoke(2);
    }

    // 给触屏按钮绑定的点击方法
    public void OnTouchClicked() {
        OnControllerSelected?.Invoke(3);
    }
}

第三步,在Unity编辑器里,把每个按钮的OnClick()事件绑定到UIManager对应的方法上。

最后,在需要接收值的脚本里订阅事件:

public class PlayerController : MonoBehaviour {
    public UIManager uiManager;

    void Awake() {
        // 订阅事件,当控制类型被选中时触发回调
        uiManager.OnControllerSelected.AddListener(HandleControllerSelection);
    }

    void HandleControllerSelection(int controllerType) {
        // 这里处理选中的控制类型
        switch(controllerType) {
            case 1:
                InitKeyboardControls();
                break;
            case 2:
                InitControllerControls();
                break;
            case 3:
                InitTouchControls();
                break;
        }
    }

    void OnDestroy() {
        // 记得取消订阅,避免内存泄漏
        uiManager.OnControllerSelected.RemoveListener(HandleControllerSelection);
    }

    // 示例控制初始化方法
    void InitKeyboardControls() { /* 键盘控制逻辑 */ }
    void InitControllerControls() { /* 手柄控制逻辑 */ }
    void InitTouchControls() { /* 触屏控制逻辑 */ }
}
方案3:PlayerPrefs(持久化保存选择)

如果你希望玩家的控制类型选择在游戏重启后依然保留,可以用PlayerPrefs存储这个值:

修改按钮脚本,把值存入PlayerPrefs:

public class KeyboardButton : MonoBehaviour { 
    public void buttonClick () { 
        PlayerPrefs.SetInt("SelectedController", 1);
        PlayerPrefs.Save(); // 手动保存确保数据写入本地
    } 
}

在其他脚本里读取这个值:

public class PlayerController : MonoBehaviour {
    void Start() {
        // 第二个参数是默认值,如果没有存储过就用1(键盘)
        int selectedType = PlayerPrefs.GetInt("SelectedController", 1);
        
        // 执行对应控制逻辑
        switch(selectedType) {
            case 1:
                InitKeyboardControls();
                break;
            case 2:
                InitControllerControls();
                break;
            case 3:
                InitTouchControls();
                break;
        }
    }

    // 示例控制初始化方法
    void InitKeyboardControls() { /* 键盘控制逻辑 */ }
    void InitControllerControls() { /* 手柄控制逻辑 */ }
    void InitTouchControls() { /* 触屏控制逻辑 */ }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:56:34