美文网首页unity
[Unity 3d] uREPL Unity Runtime 解

[Unity 3d] uREPL Unity Runtime 解

作者: 雨落随风 | 来源:发表于2019-07-09 23:50 被阅读8次

一个可以在运行时的c#脚本解释器/控制台

GitHub 上的工程多如繁星,有些好的仓库,但凡不经意间错过了就很难找回,故稍作采撷,希望能帮助到有心人。

简介:

笔者今天推荐的仓库叫 uREPL - 交互式解释器。
uREPL is an in-game powerful REPL envinronment for Unity3D that supports following functions:
uREPL 是为 Unity 准备的一个在游戏中跑的强大交互式解释器环境。

功能:

  • Any Unity-supported C# code evaluation at run time. - 在运行时执行任何Unity支持的C#语法和API

  • Emacs-like keyboard shortcuts. - 类似于 Emacs 的键盘快捷键

  • Multi-Line input. - 支持多行输入


  • Customizable completions. - 支持自定义补全

  • Command definition just by adding an attribute. - 通过添加属性的方式自定义命令

  • GameObject and Component inspecor. - 可以展示游戏对象和组件变量


  • Output logs. - 支持输出 log


  • History. - 支持历史记录

使用:

属性的使用/Attribute

You can add commands by adding a [uREPL.Command] attribute to static methods.
通过在静态方法上添加 [uREPL.Command]属性可以新增一个自定义的命令。

public class CommandTest
{
    //拿到一个游戏对象索引
    static public GameObject gameObject;


    // 这个方法能在不需要提供类名的情况下执行,命令输入如下:
    // $ ShowCurrentSelectedObject() ⏎
    [uREPL.Command]
    static public string ShowCurrentSelectedObject()
    {
        return gameObject.name;
    }

    // 可以为这个方法只定义一个名称,直接通过别名来调用,命令如下:
    // $ selected ⏎
    [uREPL.Command(name = "selected")]
    static public string ShowCurrentSelectedObject2()
    {
        return gameObject.name;
    }


    // 这个将会在你输命令时弹出命令提示/描述
    [uREPL.Command(name = "selected2", description = "show the selected gameobject name.")]
    static public string ShowCurrentSelectedObject3()
    {
        return gameObject.name;
    }
}

带参数的命令

uREPL automatically convert the command format into the actual code.
uREPL自动将命令格式转换为实际代码。

public class CommandTest
{
    // '$ print "\"hoge hoge\"" ⏎'将自动改为:
    // CommandTest.Print("\"hoge hoge\"");
    [uREPL.Command(name = "print")]
    static public void Print(object obj)
    {
        Debug.Log(obj);
    }

    // 支持命令的重写
    [uREPL.Command(name = "print")]
    static public void Print(string value1, int value2, float value3)
    {
        Debug.LogFormat("string: {0}, int: {1}, float: {2}", value1, value2, value3);
    }
}

运行时

From v0.4.0, you can register and unregister commands in runtime.
从 v0.4.0 版本开始,支持在运行时注册和反注册 命令。

using UnityEngine;
public class RuntimeCommandTest : MonoBehaviour
{
    void OnEnable()
    {
        uREPL.RuntimeCommands.Register("func1", () => Debug.Log("hoge"), "output hoge");
        uREPL.RuntimeCommands.Register("func2", x => Debug.Log(x), "outout given argument");
        uREPL.RuntimeCommands.Register("func3", (x, y) => Debug.Log((int)x * (int)y), "multiply arg0 by arg1");
        uREPL.RuntimeCommands.Register("func4", (x, y, z) => Debug.Log(x + " " + y + " " + z), "output all arguments");
        uREPL.RuntimeCommands.Register("func5", (int x) => Debug.Log(x), "output int value");
        uREPL.RuntimeCommands.Register("func6", (string x, float y) => Debug.Log(x + " is " + y), "output arg0 is arg1");
        uREPL.RuntimeCommands.Register("func7", (Vector3 pos, Quaternion rot, Vector3 scale) => Debug.Log(pos + " " + rot + " " + scale), "output unity-type values.");
    }

    void OnDisable()
    {
        uREPL.RuntimeCommands.Unregister("func1");
        uREPL.RuntimeCommands.Unregister("func2");
        uREPL.RuntimeCommands.Unregister("func3");
        uREPL.RuntimeCommands.Unregister("func4");
        uREPL.RuntimeCommands.Unregister("func5");
        uREPL.RuntimeCommands.Unregister("func6");
        uREPL.RuntimeCommands.Unregister("func7");
    }
}

演示:

UREPL
UREPL-inspect

链接:

hecomi/uREPL: In-game powerful REPL environment for Unity3D.

结语:

  • 这个解决方案非常适合那些黑客游戏吧,究竟是你玩游戏还是你玩了游戏,喜欢炫技的大佬都喜欢它,
  • 当然,用它也好比在你的游戏开了一个高端后门,怎样!
  • 同时你也可以以此深究到与Mono编译相关的知识

扩展阅读:

Unity で実行時にコードやコマンドを補完つきで実行できる uREPL を作ってみた - 凹みTips

本文集持续更新ing,喜欢记得点赞关注哦!

相关文章

网友评论

    本文标题:[Unity 3d] uREPL Unity Runtime 解

    本文链接:https://www.haomeiwen.com/subject/clyqkctx.html