Compare commits

...

7 Commits
master ... main

Author SHA1 Message Date
161617f0b6 更新使用说明 2025-06-06 10:36:52 +08:00
0205022026 删除多余文件 2025-06-06 10:30:37 +08:00
7506dc7ec2 添加使用说明文档 2025-06-06 10:28:34 +08:00
7f144a7514 删除多余文件 2025-06-06 10:21:16 +08:00
39dac62d66 上传虚幻插件demo 2025-06-05 20:00:00 +08:00
e19857b1cf 删除log文件 2025-06-05 19:58:45 +08:00
3f085e97cb 添加ai服务器端 2025-06-05 19:55:37 +08:00
197 changed files with 2489 additions and 0 deletions

14
.gitignore vendored
View File

@ -74,3 +74,17 @@ Plugins/**/Intermediate/*
# Cache files for the editor to use
DerivedDataCache/*
/AIGC/aigc.log.2025-05-31
/AIGC/aigc.log.2025-06-02
/AIGC/aigc.log.2025-06-03
/AIGC/aigc.log.2025-05-30
/TestForAIGC/Saved
/TestForAIGC/.idea
/TestForAIGC/.vs
/TestForAIGC/Binaries
/TestForAIGC/DerivedDataCache
/TestForAIGC/Intermediate
/AIGC/.vscode
/AIGC/AIGC/Include
/AIGC/AIGC/Lib
/AIGC/AIGC

13
AIGC/SetupCommand.bat Normal file
View File

@ -0,0 +1,13 @@
@echo off
REM 1. 创建虚拟环境名称为AIGC
python -m venv AIGC
REM 2. 激活虚拟环境(路径需与创建的名称一致)
call AIGC\Scripts\activate.bat
REM 3. 安装依赖需确保requirements.txt在相同目录
pip install -r requirements.txt
REM 4. 暂停并显示完成提示
echo 环境配置完成!按任意键退出...
pause

18
AIGC/StartCommand.bat Normal file
View File

@ -0,0 +1,18 @@
@echo off
chcp 65001 > nul
set OLLAMA_MODEL=deepseek-r1:7b
rem 启动Ollama服务
start "Ollama DeepSeek" cmd /k ollama run %OLLAMA_MODEL%
rem 检测11434端口是否就绪
echo 等待Ollama服务启动...
:retry
powershell -command "$result = Test-NetConnection -ComputerName localhost -Port 11434 -WarningAction SilentlyContinue; if (-not $result.TcpTestSucceeded) { exit 1 }"
if %errorlevel% neq 0 (
timeout /t 5 >nul
goto retry
)
rem 启动Python脚本
call .\AIGC\Scripts\activate.bat
start "AIGC Python" python main.py --model %OLLAMA_MODEL%

72
AIGC/Utils/AIGCLog.py Normal file
View File

@ -0,0 +1,72 @@
from datetime import datetime
import logging
from logging.handlers import TimedRotatingFileHandler
import sys
class AIGCLog:
def __init__(self, name="系统", log_file = "system.log"):
"""
初始化日志系统
:param name: 日志记录器名称显示在日志中的模块名
:param log_file: 日志文件路径
"""
self.logger = logging.getLogger(name)
self.logger.propagate = False
self.logger.setLevel(logging.DEBUG)
if not self.logger.handlers:
self.logger.handlers.clear() # 清除现有处理器
formatter = self._create_custom_formatter()
console_handler = self._create_console_handler(formatter)
file_handler = self._create_file_handler(log_file, formatter)
self.logger.addHandler(console_handler)
self.logger.addHandler(file_handler)
def _create_custom_formatter(self):
#创建自定义的日志格式
class AITimeFormatter(logging.Formatter):
def formatTime(self, record, datefmt=None):
ct = datetime.fromtimestamp(record.created)
tenth_second = int(record.msecs / 100)
return f"{ct:%Y-%m-%d %H:%M:%S}, {tenth_second}"
return AITimeFormatter(
fmt='[%(asctime)s][%(name)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
def _create_console_handler(self, formatter):
#控制台输出
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)
return console_handler
def _create_file_handler(self, log_file, formatter):
#创建文件处理爱
file_handler = TimedRotatingFileHandler(
filename=log_file,
when='midnight',
interval=1,
backupCount=7,
encoding='utf-8'
)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
return file_handler
def log(self, level, msg):
if level == logging.DEBUG:
self.logger.debug(msg)
elif level == logging.INFO:
self.logger.info(msg)
elif level == logging.WARNING:
self.logger.warning(msg)
elif level == logging.ERROR:
self.logger.error(msg)
elif level == logging.CRITICAL:
self.logger.critical(msg)
else:
self.logger.info(msg) # 默认使用INFO级别
if __name__ == "__main__":
#初始化日志系统
logger = AIGCLog(name = "系统log", log_file = "system.log")

Binary file not shown.

212
AIGC/main.py Normal file
View File

@ -0,0 +1,212 @@
import argparse
import asyncio
import json
import logging
import re
import threading
import time
from typing import List, Tuple
from fastapi import FastAPI, Request, HTTPException, WebSocket, WebSocketDisconnect
from fastapi.websockets import WebSocketState
from h11 import ConnectionClosed
import uvicorn
from Utils.AIGCLog import AIGCLog
from ollama import Client, ResponseError
app = FastAPI(title = "AI 通信服务")
logger = AIGCLog(name = "TestLog", log_file = "aigc.log")
parser = argparse.ArgumentParser()
parser.add_argument('--model', type=str, default='deepseek-r1:1.5b',
help='Ollama模型名称')
args = parser.parse_args()
logger.log(logging.INFO, f"使用的模型是 {args.model}")
#初始化ollama客户端
ollamaClient = Client(host='http://localhost:11434')
async def heartbeat(websocket: WebSocket):
while True:
await asyncio.sleep(30) # 每30秒发送一次心跳
try:
await senddata(websocket, 0, [])
except ConnectionClosed:
break # 连接已关闭时退出循环
async def senddata(websocket: WebSocket, statusCode: int, messages: List[str]):
# 将AI响应发送回UE5
if websocket.client_state == WebSocketState.CONNECTED:
data = {
"statuscode": statusCode,
"messages": messages
}
json_string = json.dumps(data, ensure_ascii=False)
await websocket.send_text(json_string)
# WebSocket路由处理
@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: str):
await websocket.accept()
logger.log(logging.INFO, f"UE5客户端 {client_id} 已连接")
# 添加心跳任务
asyncio.create_task(heartbeat(websocket))
try:
while True:
logger.log(logging.INFO, "websocket_endpoint ")
# 接收UE5发来的消息
data = await websocket.receive_text()
logger.log(logging.INFO, f"收到UE5消息 [{client_id}]: {data}")
success, prompt = process_prompt(data)
# 调用AI生成响应
if(success):
asyncio.create_task(generateAIChat(prompt, websocket))
await senddata(websocket, 0, [])
else:
await senddata(websocket, -1, [])
except WebSocketDisconnect:
#manager.disconnect(client_id)
logger.log(logging.WARNING, f"UE5客户端主动断开 [{client_id}]")
except Exception as e:
#manager.disconnect(client_id)
logger.log(logging.ERROR, f"WebSocket异常 [{client_id}]: {str(e)}")
def process_prompt(promptFromUE: str) -> Tuple[bool, str]:
try:
data = json.loads(promptFromUE)
# 提取数据
dialog_scene = data["dialogContent"]["dialogScene"]
persons = data["persons"]
assert len(persons) == 2
for person in persons:
print(f" 姓名: {person['name']}, 职业: {person['job']}")
prompt = f"""
你是一个游戏NPC对话生成器请严格按以下要求生成两个路人NPC{persons[0]["name"]}{persons[1]["name"]}的日常对话
1. 生成2轮完整对话每轮包含双方各一次发言共4句
2. 对话场景中世纪奇幻小镇的日常场景如市场/酒馆/街道
3. 角色设定
{persons[0]["name"]}{persons[0]["job"]}
{persons[1]["name"]}{persons[1]["job"]}
4. 对话要求
* 每轮对话需自然衔接体现生活细节
* 避免任务指引或玩家交互内容
* 结尾保持对话未完成感
5. 输出格式
必须确保输出内容的第一行是三个连字符`---`最后一行也是三个连字符`---`
中间内容严格按以下顺序排列禁止添加任何额外说明或换行
---
{persons[0]["name"]}[第一轮发言]
{persons[1]["name"]}[第一轮回应]
{persons[0]["name"]}[第二轮发言]
{persons[1]["name"]}[第二轮回应]
---
6.重要若未按此格式输出请重新生成直至完全符合
"""
return True, prompt
except json.JSONDecodeError as e:
print(f"JSON解析错误: {e}")
return False, ""
except KeyError as e:
print(f"缺少必要字段: {e}")
def run_webserver():
logger.log(logging.INFO, "启动web服务器 ")
#启动服务器
uvicorn.run(
app,
host="0.0.0.0",
port=8000,
timeout_keep_alive=3000,
log_level="info"
)
async def generateAIChat(prompt: str, websocket: WebSocket):
logger.log(logging.INFO, "prompt:" + prompt)
starttime = time.time()
receivemessage=[
{"role": "system", "content": prompt}
]
try:
response = ollamaClient.chat(
model = args.model,
stream = False,
messages = receivemessage,
options={
"temperature": 0.8,
"repeat_penalty": 1.2, # 抑制重复
"top_p": 0.9,
"num_ctx": 4096, # 上下文长度
"seed": 42
}
)
except ResponseError as e:
if e.status_code == 503:
print("🔄 服务不可用5秒后重试...")
return await senddata(websocket, -1, messages={"ollama 服务不可用"})
except Exception as e:
print(f"🔥 未预料错误: {str(e)}")
return await senddata(websocket, -1, messages={"未预料错误"})
logger.log(logging.INFO, "接口调用耗时 :" + str(time.time() - starttime))
logger.log(logging.INFO, "AI生成" + response['message']['content'])
#处理ai输出内容
think_remove_text = re.sub(r'<think>.*?</think>', '', response['message']['content'], flags=re.DOTALL)
pattern = r".*---(.*?)---" # .* 吞掉前面所有字符,定位最后一组
match = re.search(pattern, think_remove_text, re.DOTALL)
if not match:
await senddata(websocket, -1, messages={"ai生成格式不正确"})
else:
core_dialog = match.group(1).strip()
logger.log(logging.INFO, "AI内容处理" + core_dialog)
await senddata(websocket, 1, core_dialog.split('\n'))
if __name__ == "__main__":
# 创建并启动服务器线程
server_thread = threading.Thread(target=run_webserver)
server_thread.daemon = True # 设为守护线程(主程序退出时自动终止)
server_thread.start()
## Test
# generateAIChat(f"""
# 你是一个游戏NPC对话生成器。请严格按以下要求生成两个路人NPCA和B的日常对话
# 1. 生成【2轮完整对话】每轮包含双方各一次发言共4句
# 2. 对话场景:中世纪奇幻小镇的日常场景(如市场/酒馆/街道)
# 3. 角色设定:
# - NPC A随机职业铁匠/农夫/商人/卫兵等)
# - NPC B随机职业不同于A
# 4. 对话要求:
# * 每轮对话需自然衔接,体现生活细节
# * 避免任务指引或玩家交互内容
# * 结尾保持对话未完成感
# 5. 输出格式(严格遵循,
# ---
# A[第一轮发言]
# B[第一轮回应]
# A[第二轮发言]
# B[第二轮回应]
# ---
# """
# )
try:
# 主线程永久挂起(监听退出信号)
while True:
time.sleep(3600) # 每1小时唤醒一次避免CPU占用
except KeyboardInterrupt:
logger.log(logging.WARNING, "接收到中断信号,程序退出 ")

3
AIGC/requirements.txt Normal file
View File

@ -0,0 +1,3 @@
uvicorn[standard]
fastapi
ollama

25
AIGC/使用说明.txt Normal file
View File

@ -0,0 +1,25 @@
一.安装python环境
python 3.12下载
https://www.python.org/downloads/release/python-31210/
二.配置AI模型
1.下载安装Ollama
2.通过dos命令指定Ollama安装目录
.\OllamaSetup.exe /DIR="D:\Software\Ollama"
3.修改模型的安装目录
添加windows环境变量 OLLAMA_MODELS 设定自定义的路径
重启电脑
4.下载ai模型
根据电脑配置选择1.5b 7b 8b 14b 32b 70b 671b
ollama run deepseek-r1:1.5b
三.安装python依赖
运行SetupCommand.bat脚本
四.设置模型名称
修改StartCommand.bat中 set OLLAMA_MODEL=deepseek-r1:1.5b 对之前安装的模型
五.运行StartCommand.bat脚本

15
TestForAIGC/.vsconfig Normal file
View File

@ -0,0 +1,15 @@
{
"version": "1.0",
"components": [
"Microsoft.Net.Component.4.6.2.TargetingPack",
"Microsoft.VisualStudio.Component.Unreal.Workspace",
"Microsoft.VisualStudio.Component.VC.14.38.17.8.ATL",
"Microsoft.VisualStudio.Component.VC.14.38.17.8.x86.x64",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.Windows11SDK.22621",
"Microsoft.VisualStudio.Workload.CoreEditor",
"Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.VisualStudio.Workload.NativeDesktop",
"Microsoft.VisualStudio.Workload.NativeGame"
]
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,92 @@
[/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Engine/Maps/Templates/OpenWorld
[/Script/Engine.RendererSettings]
r.AllowStaticLighting=False
r.GenerateMeshDistanceFields=True
r.DynamicGlobalIlluminationMethod=1
r.ReflectionMethod=1
r.SkinCache.CompileShaders=True
r.RayTracing=True
r.Shadow.Virtual.Enable=1
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True
r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8
r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8
[/Script/WindowsTargetPlatform.WindowsTargetSettings]
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12
-D3D12TargetedShaderFormats=PCD3D_SM5
+D3D12TargetedShaderFormats=PCD3D_SM6
-D3D11TargetedShaderFormats=PCD3D_SM5
+D3D11TargetedShaderFormats=PCD3D_SM5
Compiler=Default
AudioSampleRate=48000
AudioCallbackBufferFrameSize=1024
AudioNumBuffersToEnqueue=1
AudioMaxChannels=0
AudioNumSourceWorkers=4
SpatializationPlugin=
SourceDataOverridePlugin=
ReverbPlugin=
OcclusionPlugin=
CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)
CacheSizeKB=65536
MaxChunkSizeOverrideKB=0
bResampleForDevice=False
MaxSampleRate=48000.000000
HighSampleRate=32000.000000
MedSampleRate=24000.000000
LowSampleRate=12000.000000
MinSampleRate=8000.000000
CompressionQualityModifier=1.000000
AutoStreamingThreshold=0.000000
SoundCueCookQualityIndex=-1
[/Script/LinuxTargetPlatform.LinuxTargetSettings]
-TargetedRHIs=SF_VULKAN_SM5
+TargetedRHIs=SF_VULKAN_SM6
[/Script/HardwareTargeting.HardwareTargetingSettings]
TargetedHardwareClass=Desktop
AppliedTargetedHardwareClass=Desktop
DefaultGraphicsPerformance=Maximum
AppliedDefaultGraphicsPerformance=Maximum
[/Script/WorldPartitionEditor.WorldPartitionEditorSettings]
CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet'
[/Script/Engine.UserInterfaceSettings]
bAuthorizeAutomaticWidgetVariableCreation=False
FontDPIPreset=Standard
FontDPI=72
[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/TestForAIGC")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/TestForAIGC")
[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings]
bEnablePlugin=True
bAllowNetworkConnection=True
SecurityToken=3C9B8CEA4B62FF98DBA3E591CFFFFC35
bIncludeInShipping=False
bAllowExternalStartInShipping=False
bCompileAFSProject=False
bUseCompression=False
bLogFiles=False
bReportStats=False
ConnectionType=USBOnly
bUseManualIPAddress=False
ManualIPAddress=

View File

@ -0,0 +1,3 @@
[/Script/EngineSettings.GeneralProjectSettings]
ProjectID=8D564B1347B06FE4BF7DD5B781D2DB59

View File

@ -0,0 +1,84 @@
[/Script/Engine.InputSettings]
-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
+AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
bAltEnterTogglesFullscreen=True
bF11TogglesFullscreen=True
bUseMouseForTouch=False
bEnableMouseSmoothing=True
bEnableFOVScaling=True
bCaptureMouseOnLaunch=True
bEnableLegacyInputScales=True
bEnableMotionControls=True
bFilterInputByPlatformUser=False
bShouldFlushPressedKeysOnViewportFocusLost=True
bAlwaysShowTouchInterface=False
bShowConsoleOnFourFingerTap=True
bEnableGestureRecognizer=False
bUseAutocorrect=False
DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown
DefaultViewportMouseLockMode=LockOnCapture
FOVScale=0.011110
DoubleClickTime=0.200000
DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput
DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent
DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks
-ConsoleKeys=Tilde
+ConsoleKeys=Tilde

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More