Unity+Python 用知识图谱实现医药智能问询系统

——引言
直接进主题,本项目在“基于知识图谱的医药问答系统实战”的基础上,结合Untiy做的前端,实现了Windows系统下的可视化医药智能问询系统。
U3D端的结果展示如下,

Unity+Python医药问询系统前端展示

这其中遇到了一些困难,包括Python环境的配置、Python中安装包版本的适配,Unity与Python程序的通信,中途遇到的各种程序实现困难和bug等等,下面做一个学习过程的梳理,记录一下主要遇到的困难。

一、背景介绍

  1. 关于知识图谱
    网上的介绍很多,根据我的理解,知识图谱是运用图数据库(主流用Neo4j)来建立和展示实体、属性及其关系的一个领域知识网络拓扑图。(大家以专业解释为准)建立好这个图数据库之后,可以通过程序操作图数据库,开发应用程序,如专家系统等。
  2. Unity3D开发前端
    为什么用U3D,原因是我本行是做U3D开发的,其他合适的前端开发方式都可以。

二、开发过程遇到的主要困难及解决方案
3. Python环境配置
因为项目是2020的,用的Python3.6,其他安装包的下载安装隔得时间长了,不完全记得,可以参考“中文医学知识图谱CMeKG项目环境配置的摸索”
先把已经Python程序调试跑通。

  1. Unity中用Process API调用Python程序,遇到中文无法正确编码解码的问题
    由于需要从Unity传输用户的问题(中文)给Python程序,于是用了Process中的参数传递方法,但发现Untiy发给Python的中文经过参数传回打印,发现无法正确解码为对应的中文内容。
    为了解决这个问题,把Unicode,utf8,gbk…的原理都看了,也尝试了各种编码解码的方式,都没能解决,如果有大神能提供方案,万分感谢~
    最后,选择了用MySQL,通过Unity将中文问题写入数据库,Python程序读取数据库的方式来解决中文字符通信的问题。

  2. Unity写数据,Python读数据都不难实现,也各自通过测试。而后Python根据问题找到答案后,同样写入MySQL数据库,Unity再去对应读取中文答案,展示出来。但当程序完整去执行的时候,Unity调用Python会完全卡主,不知道Python有没有正常运行,因为这里是用Process调用执行Python,看不到Python的运行情况,所以又用了记录日志的方式去测试Python程序究竟卡在哪里了。
    打印Python日志,我用了很简单的一个“import logging”的方式,短短一行代码logging.basicConfig(filename=‘路径/文件名称.log’, level=logging.DEBUG, format=‘%(asctime)s - %(levelname)s - %(message)s’, datefmt=‘%Y-%m-%d %H:%M:%S’) 就解决了。
    打印日志,发现Python程序卡在
    self.disease_wds= [i.strip() for i in open(self.disease_path,encoding=“utf-8”) if i.strip()]
    为什么会卡在这儿呢?是因为循环吗?用for循环测试了一下,Unity里面能跑的通for循环这段代码,这个问题足足花了一两天时间,最后被ChatGPT解决了,如下截图给的灵感:
    在这里插入图片描述
    问题居然出在此语句中用到的path,Python程序中文件路径用的/ ,Windows中要用\ 。其实这个问题我挺纳闷的,比如上面的logging路径,我就用的/,没有问题。不管怎么样,这里换成“\” (两个反斜杠,发布后变成一个反斜杠了),程序就跑通了。
    在这里插入图片描述

对了,上面Phyton卡住,我用了日志,只测出来卡在了哪一句,但我并不确定Python程序究竟是卡住了,还是退出了,最后确定是退出了,如何知道的呢?
在Unity中,通过以下代码
// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{
print(
$“Exit time : {pythonProcess.ExitTime}\n” +
$“Exit code : {pythonProcess.ExitCode}\n” +
$“Elapsed time : {Math.Round((pythonProcess.ExitTime - pythonProcess.StartTime).TotalMilliseconds)}”);
eventHandled.TrySetResult(true);
}

在Process 调用执行python前的配置中,加一句pythonProcess.Exited += new EventHandler(myProcess_Exited);

这样就可以知道python的运行情况,当时报的exit code:1 ,经过查询说发生这个一般是由于循环导致的退出,印证了之前打印日志显现的问题。

三、总结
整个项目的制作过程遇到的细节问题肯定不止这些,记下来的是我印象深刻的部分。“车到山前必有路”,要相信,遇到困难,想办法去解决,总会有出路的。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在 Unity 中,可以使用 VRTK(Virtual Reality Toolkit)来实现与 NPC 对话。以下是实现的步骤: 1. 创建 NPC 对象和对话框 首先,需要创建一个 NPC 对象并设置它的属性,例如名称、对话内容等。接着,可以在 Unity 中创建一个对话框,在对话框中显示 NPC 的对话内容。 2. 创建触发器 在 NPC 对象周围创建一个触发器,当玩家进入该触发器范围时,触发器会检测到并触发对话事件。 3. 编写脚本 使用 C# 编写脚本,当玩家进入触发器范围时,触发对话框的显示,并在对话框中显示 NPC 的对话内容。此外,还需要编写脚本来处理玩家的回应,并根据玩家的回应来触发不同的事件。 4. 实现交互 在对话框中加入交互元素,例如按钮、输入框等,使玩家可以进行回应。在编写脚本时,需要处理玩家的回应,并根据不同的回应触发不同的事件。 以上是实现与 NPC 对话的基本步骤,具体实现还需要根据游戏需求进行调整和完善。 ### 回答2: Unity VRTK能够通过以下步骤实现与NPC的对话: 1. NPC设定:首先,需要在场景中创建NPC角色,并为其添加互动组件。通常,可以为NPC角色添加VR互动组件,如VRTK_InteractableObject。 2. 对话触发器:创建一个对话触发器,当玩家接近NPC时触发对话。触发器可以是一个特定的区域、碰撞器或是其他检测玩家与NPC距离的机制。一旦玩家接近NPC,对话触发器将被激活。 3. 对话系统:在对话触发器中实现一个对话系统。这可以通过创建一个对话控制脚本来完成。在此脚本中,可以定义对话的内容、顺序和条件。例如,可以使用数组或列表存储对话内容,并使用条件语句来控制哪些对话会被触发。 4. 输入交互:在对话控制脚本中,可以通过VR输入交互来控制对话的进行。例如,可以使用手柄按钮来触发下一条对话或选择不同的选项。VR互动组件VRTK_InteractObjectHighlighter可以用于突出显示可交互的NPC,以指示玩家可以与之进行对话。 5. 对话反馈:为了增加对话的沉浸感,可以通过音频、动画或头部追踪等方式实现对话反馈。这可以使对话更加生动,并为玩家提供更真实的体验。 总结来说,要在Unity VRTK中实现与NPC的对话,我们需要创建NPC角色并添加互动组件,创建对话触发器,并在对话控制脚本中实现对话系统。通过VR输入交互和对话反馈,可以提供更加沉浸式的对话体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值