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

Unity C#开发中如何跨文件调用其他脚本的public void方法?

问题结论

你当前的写法无法正常运行,会直接触发C#编译错误,核心问题是不符合C#语法规则与Unity脚本的调用逻辑,不需要复杂配置,只要修正代码结构就能正常调用。


问题原因
  • C#语法要求所有方法必须归属在类/结构体内部,你当前GameTools.cs里直接定义DoSomething方法,没有外层类包裹,本身就无法通过编译。
  • 即使补全了类定义,非静态方法必须依托类的实例才能调用,你在IntroBehavior里直接写DoSomething(),编译器只会查找IntroBehavior类自身的同名方法,根本不会定位到GameTools里的逻辑。

推荐实现方案

根据你封装通用工具方法的需求,优先选第一种静态类方案,实现最简单也最符合工具类的定位。

方案1:静态工具类(无通用状态的工具逻辑首选)

直接把GameTools改成静态类,方法也标记为静态,全局不需要挂载组件就能直接调用。
修改后的GameTools.cs代码:

//GameTools.cs
public static class GameTools
{
    public static void DoSomething() 
    {
        //some code
        //some more code
    }
}

IntroBehavior.cs里调用时指定类名即可:

//IntroBehavior.cs
using UnityEngine;

public class IntroBehavior : MonoBehaviour
{
    void Start() {
        GameTools.DoSomething();
    }
}

只要两个脚本都放在项目Assets目录下,不需要额外加引用配置;如果你给脚本加了自定义命名空间,只要在调用方写对应using语句引入命名空间就行。

方案2:MonoBehaviour挂载类(需要依赖Unity生命周期、存状态时用)

如果你的工具方法需要访问Unity组件、要在场景里存持久状态,就把GameTools做成继承MonoBehaviour的脚本类:

//GameTools.cs
using UnityEngine;
public class GameTools : MonoBehaviour
{
    public void DoSomething() 
    {
        //some code
        //some more code
    }
}

这种情况需要做两步配置才能调用:

  • 把GameTools脚本挂载到场景内任意一个GameObject上
  • 在IntroBehavior里获取GameTools的实例引用,再调用方法,参考代码:
//IntroBehavior.cs
using UnityEngine;

public class IntroBehavior : MonoBehaviour
{
    // 可直接在Unity Inspector面板拖入挂了GameTools脚本的对象赋值
    [SerializeField] private GameTools _gameTools;

    void Start() {
        // 没在Inspector拖引用的话,运行时查找场景内的实例
        if (_gameTools == null)
        {
            _gameTools = FindObjectOfType<GameTools>();
        }
        _gameTools.DoSomething();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.09 16:15:43