当前位置: 首页 > article >正文

UE(虚幻)学习(二) 使用UnrealSharp插件让UE支持C#脚本

UE支持C++脚本,但是有很多脚本接口是在Unity里使用的,如果翻译成C++那么工作量太大了,找了几个把C#转成C++的工具,很多C#的新的语法是无法处理的就放弃了,那么让UE直接可以运行C#脚本呢?

搜了几个插件都不再更新了,例如黑神话悟空用的USharp(可能)也是改了很多脚本勉强使用,后来发现插件UnrealSharp比较新,目前还是测试阶段,大胆使用一番。

安装 UnrealSharp

根据官方文档
https://www.unrealsharp.com/getting-started/quickstart
需要安装.NET 9.0 SDK

将源码clone到虚幻项目目录Plugins中,没有Plugins手动建立一个,这里要确保你的项目已经有C++工程。

直接启动UE项目

在这里插入图片描述
如果出现了错误
在这里插入图片描述
右键点击uproject重新生成vs项目文件。

在这里插入图片描述
进入VS进行编译.我们点击重新生成解决方案,如果有报错,请参考我[上一篇文章]。

编译发现报错了,应该是测试版还不问题,哪里有问题
在这里插入图片描述
,我们找到了一个配置文件F:\UEProjects\MyProject3\Plugins\UnrealSharp\Source\UnrealSharpScriptGenerator、UnrealSharpScriptGenerator.ubtplugin.csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
	<PropertyGroup>
		<EngineDir Condition="'$(EngineDir)' == ''">C:\Program Files\Epic Games\UE_5.5\Engine</EngineDir>
	</PropertyGroup>
</Project>

这里有一个UE的路径错误,我们改成自己的UE路径,右键点击再次编译,又发现了错误

28>An error occurred during the export process:
28>EXEC : error Message: Failed to invoke dotnet with arguments: publish "F:/UEProjects/MyProject3/Plugins/UnrealSharp\Managed\UnrealSharp" -p:PublishDir="F:/UEProjects/MyProject3/Plugins/UnrealSharp\Binaries\Managed"
28>Stack Trace:
28>   at UnrealSharpScriptGenerator.Utilities.DotNetUtilities.InvokeDotNet(Collection`1 arguments) in F:\UEProjects\MyProject3\Plugins\UnrealSharp\Source\UnrealSharpScriptGenerator\Utilities\DotNetUtilities.cs:line 90
28>   at UnrealSharpScriptGenerator.Utilities.DotNetUtilities.BuildSolution(String projectRootDirectory) in F:\UEProjects\MyProject3\Plugins\UnrealSharp\Source\UnrealSharpScriptGenerator\Utilities\DotNetUtilities.cs:line 70
28>   at UnrealSharpScriptGenerator.Program.Main(IUhtExportFactory factory) in F:\UEProjects\MyProject3\Plugins\UnrealSharp\Source\UnrealSharpScriptGenerator\Program.cs:line 67
28>Total of 0 written
28>Reflection code generated for MyProject3Editor in 53.8045663 seconds

发现是.dotnet publish命令出错,没有详细的信息。我们手动在CMD上执行看看:

C:\Users\Administrator>dotnet --version
9.0.101

C:\Users\Administrator>dotnet publish "F:/UEProjects/MyProject3/Plugins/UnrealSharp\Managed\UnrealSharp" -p:PublishDir="F:/UEProjects/MyProject3/Plugins/UnrealSharp\Binaries\Managed"

我们发现两处报错

F:\UEProjects\MyProject3\Plugins\UnrealSharp\Managed\UnrealSharp\UnrealSharp\Extensions\Engine\DataTable.cs(82,42): error CS0117: “UDataTableFunctionLibrary”未包含“DoesRowExist ”的定义
F:\UEProjects\MyProject3\Plugins\UnrealSharp\Managed\UnrealSharp\UnrealSharp\Extensions\Engine\DataTable.cs(127,35): error CS0117: “UDataTableFunctionLibrary”未包含“GetRowNames ”的定义

到这里感觉插件有问题了,不能再深究下去了。果然未发布版本问题多多,看到作者最近有修改,我用之前两周的插件再试试。拷贝到Plugins后,运行UE打开项目,果然一次就进去了。

在这里插入图片描述
第一次进入会有一个创建C#项目的提示,我们点击Yes,会在目录里出现一个Script目录和C#的工程。

工具栏也会出现插件的功能。
在这里插入图片描述

第一个C#脚本

打开c#项目,创建一个脚本,按照文档的例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnrealSharp.Attributes;
using UnrealSharp.Engine;

namespace ManagedMyProject3
{
    [UClass]
    internal class ACSharpFirst:AActor
    {
        [UProperty(PropertyFlags.BlueprintReadOnly)]
        public int MyInt { get; set; }

        protected override void BeginPlay()
        {
            PrintString("Hello from C#!");
            base.BeginPlay();
        }

        [UFunction(FunctionFlags.BlueprintCallable)]
        public void MyFunction(bool myBool, int MyInt)
        {
            PrintString("Hello from MyFunction!");
        }
    }
}

UE里我们建立一个蓝图
在这里插入图片描述
如果没有,那么我们需要编译下
在这里插入图片描述
把蓝图丢入场景,运行,我们看到C#代码执行了:
在这里插入图片描述
经过我的测试,我把Unity上之前写的Socket程序直接拉过来可用。
因为之前的脚本都是网络的,控制台程序。核心程序不用改,把调用的壳子改成插件需要的,稍微改动一下直接就可以使用了,省了很多时间。

UE项目源码就不放了,就是个空项目。
文章附带了可以用不报错的Unrealsharp插件,希望插件作者能把插件搞稳定,挺不错的。

不知道还有哪些好用的C#插件,欢迎留言讨论。

参考:
https://www.unrealsharp.com/getting-started/your-first-script


http://www.kler.cn/a/460043.html

相关文章:

  • oceanbase集群访问异常问题处理
  • Flume的安装和使用
  • Docker--Docker Container(容器) 之 操作实例
  • 【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算
  • 单区域OSPF配置实验
  • latex技巧
  • Harbor(2.3.0)的定制页面与安装(x86 arm)
  • 科龙空调:以创新科技,适配多元家居场景
  • 最短路径-Dijkstra 算法
  • 【记录】列表自动滚动轮播功能实现
  • 如何恢复永久删除的PPT文件?查看数据恢复教程!
  • STM32中断详解
  • RabbitMQ基础篇之数据隔离
  • 【机器学习】机器学习的基本分类-半监督学习-半监督生成对抗网络(Semi-supervised GANs)
  • Effective C++ 条款41:了解隐式接口和编译期多态
  • mysql只恢复某个库或某个表
  • 算法环境安装GPU驱动、CUDA、cuDNN、Docker及NVIDIA Container Toolkit
  • node.js文件压缩包解析,反馈解析进度,解析后的文件字节正常
  • Ungoogled Chromium127编译指南 Linux篇 - 项目要求(二)
  • 华为,新华三,思科网络设备指令
  • 异步爬虫之aiohttp的使用
  • fetch请求代码
  • 大数据_HBase的列族属性配置
  • Kotlin 协程基础知识总结四 —— Flow
  • 基于PyQt5的UI界面开发——图像与视频的加载与显示
  • Java爬虫获取速卖通(AliExpress)商品详情