feat(benchmark): 接入 AstarPro RVO 压测方案

This commit is contained in:
JSD\13999
2026-06-15 16:19:16 +08:00
parent bb4e940afd
commit 6854cca5a6
24 changed files with 740 additions and 24 deletions

View File

@@ -165,3 +165,10 @@ MonoBehaviour:
dimensionMode: 1
viewMode: 0
fishCount: 300
fishMaterial: {fileID: 2100000, guid: 48d562f3b265c9d4a803f967cf69c6f0, type: 2}
fishMaxSpeed: 2.4
baitDemoMaxSpeed: 4.2
speedMultiplier: 1
timeScale: 1
hookDropHeight: 10
hookDropDuration: 1.5

View File

@@ -7,7 +7,8 @@ namespace FishROV.AvoidanceBenchmark
{
NoAvoidance = 0,
Rvo2 = 1,
SamplingLocal = 2
AstarProRvo = 2,
AstarProRvoVelocityLike = 3
}
public enum AvoidanceScenarioKind
@@ -15,7 +16,8 @@ namespace FishROV.AvoidanceBenchmark
FreeSwim = 0,
CrossFlow = 1,
NarrowPassage = 2,
DenseCircleStress = 3
DenseCircleStress = 3,
BaitScramble = 4
}
public enum AvoidanceDimensionMode

View File

@@ -0,0 +1,167 @@
using System.Collections.Generic;
using Pathfinding.RVO;
using Pathfinding.Util;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
namespace FishROV.AvoidanceBenchmark
{
public sealed class AstarProRvoAdapter : IAvoidanceAdapter
{
private const float TimeHorizon = 2.5f;
private const float ObstacleTimeHorizon = 2.5f;
private const float TargetLookAheadDistanceMultiplier = 4f;
private const float BoundaryPadding = 0.15f;
private readonly Dictionary<BenchmarkAgent, IAgent> agents = new Dictionary<BenchmarkAgent, IAgent>(512);
private readonly Dictionary<BenchmarkAgent, float> verticalVelocities = new Dictionary<BenchmarkAgent, float>(512);
private SimulatorBurst simulator;
private AvoidanceBenchmarkConfig config;
public string Name => "A* Pro RVO";
public bool IsAvailable => simulator != null;
public string Status => config != null && config.DimensionMode == AvoidanceDimensionMode.XYZ3D
? $"A* Pathfinding Project Pro RVO 已接入,当前 {agents.Count} 个对象RVO 按 XZ 平面计算3D 压测会投影为水平避障。"
: $"A* Pathfinding Project Pro RVO 已接入,当前 {agents.Count} 个对象。";
public void Initialize(AvoidanceBenchmarkConfig config)
{
this.config = config.Clone();
agents.Clear();
verticalVelocities.Clear();
simulator = new SimulatorBurst(MovementPlane.XZ)
{
HardCollisions = true,
SymmetryBreakingBias = 0.1f,
UseNavmeshAsObstacle = false
};
}
public BenchmarkAgent CreateAgent(BenchmarkAgentSpawnInfo spawnInfo, Transform parent)
{
var agent = BenchmarkAgent.CreatePrimitive(spawnInfo, parent);
if (simulator == null)
{
return agent;
}
var rvoAgent = simulator.AddAgent(spawnInfo.Position);
rvoAgent.MovementPlane = SimpleMovementPlane.XZPlane;
rvoAgent.Radius = Mathf.Max(0.01f, spawnInfo.Radius);
rvoAgent.Height = Mathf.Max(0.01f, spawnInfo.Height);
rvoAgent.AgentTimeHorizon = TimeHorizon;
rvoAgent.ObstacleTimeHorizon = ObstacleTimeHorizon;
rvoAgent.MaxNeighbours = Mathf.Max(1, config.MaxNeighbours);
rvoAgent.Priority = Mathf.Clamp01(spawnInfo.Priority <= 0f ? 0.5f : spawnInfo.Priority);
rvoAgent.Layer = RVOLayer.DefaultAgent;
rvoAgent.CollidesWith = (RVOLayer)(-1);
rvoAgent.Position = spawnInfo.Position;
rvoAgent.SetTarget(spawnInfo.Position, 0f, agent.MaxSpeed, NoEndOfPath());
agents[agent] = rvoAgent;
verticalVelocities[agent] = 0f;
return agent;
}
public void SetPreferredVelocity(BenchmarkAgent agent, Vector3 preferredVelocity)
{
if (simulator == null || !agents.TryGetValue(agent, out var rvoAgent))
{
agent.ApplyVelocity(preferredVelocity);
return;
}
var clamped = Vector3.ClampMagnitude(preferredVelocity, agent.MaxSpeed);
var horizontal = new Vector3(clamped.x, 0f, clamped.z);
var speed = Mathf.Min(agent.MaxSpeed, horizontal.magnitude);
var position = agent.transform.position;
verticalVelocities[agent] = config.DimensionMode == AvoidanceDimensionMode.XYZ3D ? clamped.y : 0f;
rvoAgent.Position = position;
if (speed <= 0.001f)
{
rvoAgent.SetTarget(position, 0f, agent.MaxSpeed, NoEndOfPath());
return;
}
var target = position + horizontal.normalized * Mathf.Max(agent.Radius * 2f, config.ArenaRadius * TargetLookAheadDistanceMultiplier);
rvoAgent.SetTarget(target, speed, agent.MaxSpeed, NoEndOfPath());
}
public void SetTarget(BenchmarkAgent agent, Vector3 target)
{
agent.Target = target;
}
public void Tick(float deltaTime)
{
if (simulator == null || deltaTime <= 0f)
{
return;
}
simulator.Update(default(JobHandle), Mathf.Max(0.001f, deltaTime), false, Allocator.TempJob).Complete();
foreach (var pair in agents)
{
var agent = pair.Key;
var rvoAgent = pair.Value;
var direction = rvoAgent.CalculatedTargetPoint - agent.transform.position;
direction.y = 0f;
var speed = Mathf.Min(agent.MaxSpeed, rvoAgent.CalculatedSpeed);
var velocity = direction.sqrMagnitude > 0.0001f
? direction.normalized * speed
: Vector3.zero;
velocity = KeepVelocityInsideArena(agent.transform.position, velocity);
if (verticalVelocities.TryGetValue(agent, out var verticalVelocity))
{
velocity.y = verticalVelocity;
}
agent.ApplyVelocity(velocity);
}
}
public void Dispose()
{
agents.Clear();
verticalVelocities.Clear();
simulator?.OnDestroy();
simulator = null;
config = null;
}
private static Vector3 NoEndOfPath()
{
return new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
}
private Vector3 KeepVelocityInsideArena(Vector3 position, Vector3 velocity)
{
if (config == null)
{
return velocity;
}
var flatPosition = new Vector2(position.x, position.z);
var flatVelocity = new Vector2(velocity.x, velocity.z);
var radius = Mathf.Max(0.01f, config.ArenaRadius - BoundaryPadding);
if (flatPosition.magnitude < radius || flatVelocity.sqrMagnitude <= 0.0001f)
{
return velocity;
}
var outward = flatPosition.normalized;
var outwardSpeed = Vector2.Dot(flatVelocity, outward);
if (outwardSpeed <= 0f)
{
return velocity;
}
flatVelocity -= outward * outwardSpeed;
velocity.x = flatVelocity.x;
velocity.z = flatVelocity.y;
return velocity;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c15d8b6404f05fb49bbe215a0d853b90
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,166 @@
using System.Collections.Generic;
using Pathfinding.RVO;
using Pathfinding.Util;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
namespace FishROV.AvoidanceBenchmark
{
public sealed class AstarProRvoVelocityLikeAdapter : IAvoidanceAdapter
{
private const float TimeHorizon = 2.5f;
private const float ObstacleTimeHorizon = 2.5f;
private const float BoundaryPadding = 0.15f;
private readonly Dictionary<BenchmarkAgent, IAgent> agents = new Dictionary<BenchmarkAgent, IAgent>(512);
private readonly Dictionary<BenchmarkAgent, float> verticalVelocities = new Dictionary<BenchmarkAgent, float>(512);
private SimulatorBurst simulator;
private AvoidanceBenchmarkConfig config;
public string Name => "A* Pro RVO VelocityLike";
public bool IsAvailable => simulator != null;
public string Status => config != null && config.DimensionMode == AvoidanceDimensionMode.XYZ3D
? $"A* Pathfinding Project Pro RVO velocity-like adapter active, {agents.Count} agents; RVO still solves on XZ plane."
: $"A* Pathfinding Project Pro RVO velocity-like adapter active, {agents.Count} agents.";
public void Initialize(AvoidanceBenchmarkConfig config)
{
this.config = config.Clone();
agents.Clear();
verticalVelocities.Clear();
simulator = new SimulatorBurst(MovementPlane.XZ)
{
HardCollisions = true,
SymmetryBreakingBias = 0.1f,
UseNavmeshAsObstacle = false
};
}
public BenchmarkAgent CreateAgent(BenchmarkAgentSpawnInfo spawnInfo, Transform parent)
{
var agent = BenchmarkAgent.CreatePrimitive(spawnInfo, parent);
if (simulator == null)
{
return agent;
}
var rvoAgent = simulator.AddAgent(spawnInfo.Position);
rvoAgent.MovementPlane = SimpleMovementPlane.XZPlane;
rvoAgent.Radius = Mathf.Max(0.01f, spawnInfo.Radius);
rvoAgent.Height = Mathf.Max(0.01f, spawnInfo.Height);
rvoAgent.AgentTimeHorizon = TimeHorizon;
rvoAgent.ObstacleTimeHorizon = ObstacleTimeHorizon;
rvoAgent.MaxNeighbours = Mathf.Max(1, config.MaxNeighbours);
rvoAgent.Priority = Mathf.Clamp01(spawnInfo.Priority <= 0f ? 0.5f : spawnInfo.Priority);
rvoAgent.Layer = RVOLayer.DefaultAgent;
rvoAgent.CollidesWith = (RVOLayer)(-1);
rvoAgent.Position = spawnInfo.Position;
rvoAgent.SetTarget(spawnInfo.Position, 0f, agent.MaxSpeed, NoEndOfPath());
agents[agent] = rvoAgent;
verticalVelocities[agent] = 0f;
return agent;
}
public void SetPreferredVelocity(BenchmarkAgent agent, Vector3 preferredVelocity)
{
if (simulator == null || !agents.TryGetValue(agent, out var rvoAgent))
{
agent.ApplyVelocity(preferredVelocity);
return;
}
var clamped = Vector3.ClampMagnitude(preferredVelocity, agent.MaxSpeed);
var horizontal = new Vector3(clamped.x, 0f, clamped.z);
var speed = Mathf.Min(agent.MaxSpeed, horizontal.magnitude);
var position = agent.transform.position;
verticalVelocities[agent] = config.DimensionMode == AvoidanceDimensionMode.XYZ3D ? clamped.y : 0f;
rvoAgent.Position = position;
if (speed <= 0.001f)
{
rvoAgent.SetTarget(position, 0f, agent.MaxSpeed, NoEndOfPath());
return;
}
var target = position + horizontal;
rvoAgent.SetTarget(target, speed, speed, NoEndOfPath());
}
public void SetTarget(BenchmarkAgent agent, Vector3 target)
{
agent.Target = target;
}
public void Tick(float deltaTime)
{
if (simulator == null || deltaTime <= 0f)
{
return;
}
simulator.Update(default(JobHandle), Mathf.Max(0.001f, deltaTime), false, Allocator.TempJob).Complete();
foreach (var pair in agents)
{
var agent = pair.Key;
var rvoAgent = pair.Value;
var direction = rvoAgent.CalculatedTargetPoint - agent.transform.position;
direction.y = 0f;
var speed = Mathf.Min(agent.MaxSpeed, rvoAgent.CalculatedSpeed);
var velocity = direction.sqrMagnitude > 0.0001f
? direction.normalized * speed
: Vector3.zero;
velocity = KeepVelocityInsideArena(agent.transform.position, velocity);
if (verticalVelocities.TryGetValue(agent, out var verticalVelocity))
{
velocity.y = verticalVelocity;
}
agent.ApplyVelocity(velocity);
}
}
public void Dispose()
{
agents.Clear();
verticalVelocities.Clear();
simulator?.OnDestroy();
simulator = null;
config = null;
}
private static Vector3 NoEndOfPath()
{
return new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
}
private Vector3 KeepVelocityInsideArena(Vector3 position, Vector3 velocity)
{
if (config == null)
{
return velocity;
}
var flatPosition = new Vector2(position.x, position.z);
var flatVelocity = new Vector2(velocity.x, velocity.z);
var radius = Mathf.Max(0.01f, config.ArenaRadius - BoundaryPadding);
if (flatPosition.magnitude < radius || flatVelocity.sqrMagnitude <= 0.0001f)
{
return velocity;
}
var outward = flatPosition.normalized;
var outwardSpeed = Vector2.Dot(flatVelocity, outward);
if (outwardSpeed <= 0f)
{
return velocity;
}
flatVelocity -= outward * outwardSpeed;
velocity.x = flatVelocity.x;
velocity.z = flatVelocity.y;
return velocity;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bc0b8d77778b4af6bfd3e9632ff02c48
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -10,8 +10,10 @@ namespace FishROV.AvoidanceBenchmark
return new NoAvoidanceAdapter();
case AvoidanceFrameworkKind.Rvo2:
return new Rvo2Adapter();
case AvoidanceFrameworkKind.SamplingLocal:
return new SamplingLocalAvoidanceAdapter();
case AvoidanceFrameworkKind.AstarProRvo:
return new AstarProRvoAdapter();
case AvoidanceFrameworkKind.AstarProRvoVelocityLike:
return new AstarProRvoVelocityLikeAdapter();
default:
return new UnavailableAvoidanceAdapter(kind);
}

View File

@@ -66,6 +66,7 @@ namespace FishROV.AvoidanceBenchmark
}
simulator.SetAgentPosition(id, ToRvoVector(agent.transform.position));
simulator.SetAgentMaxSpeed(id, Mathf.Max(0.01f, agent.MaxSpeed));
simulator.SetAgentPrefVelocity(id, ToRvoVector(Vector3.ClampMagnitude(preferredVelocity, agent.MaxSpeed)));
}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4b6e9d462e8dff84bb55e413c65abd73
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9ae2ae52201ae7e4cb93944bcf40ed31
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,23 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 98e3089fbc7bff2b78412546c703c554, type: 3}
m_Name: AstarGizmos
m_EditorClassIdentifier:
version: 0
settings:
lineOpacity: 1
solidOpacity: 0.55
textOpacity: 1
lineOpacityBehindObjects: 0.12
solidOpacityBehindObjects: 0.45
textOpacityBehindObjects: 0.9
curveResolution: 1

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7535552aa4143bd41b4196e5eeb2e5ba
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

83
FishROV/Assets/test.mat Normal file
View File

@@ -0,0 +1,83 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: test
m_Shader: {fileID: 10703, guid: 0000000000000000f000000000000000, type: 0}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 1
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 48d562f3b265c9d4a803f967cf69c6f0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,5 +1,8 @@
{
"dependencies": {
"com.unity.burst": "1.8.7",
"com.unity.collections": "1.5.1",
"com.unity.mathematics": "1.2.6",
"com.unity.test-framework": "1.1.33",
"com.unity.textmeshpro": "3.0.7",
"com.unity.timeline": "1.7.7",

View File

@@ -1,5 +1,25 @@
{
"dependencies": {
"com.unity.burst": {
"version": "1.8.7",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.mathematics": "1.2.1"
},
"url": "https://packages.unity.cn"
},
"com.unity.collections": {
"version": "1.5.1",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.burst": "1.6.6",
"com.unity.nuget.mono-cecil": "1.11.4",
"com.unity.test-framework": "1.1.31"
},
"url": "https://packages.unity.cn"
},
"com.unity.ext.nunit": {
"version": "1.0.6",
"depth": 1,
@@ -7,6 +27,20 @@
"dependencies": {},
"url": "https://packages.unity.cn"
},
"com.unity.mathematics": {
"version": "1.2.6",
"depth": 0,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.cn"
},
"com.unity.nuget.mono-cecil": {
"version": "1.11.4",
"depth": 1,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.cn"
},
"com.unity.test-framework": {
"version": "1.1.33",
"depth": 0,

View File

@@ -0,0 +1,17 @@
{
"MonoBehaviour": {
"Version": 4,
"EnableBurstCompilation": true,
"EnableOptimisations": true,
"EnableSafetyChecks": false,
"EnableDebugInAllBuilds": false,
"DebugDataKind": 1,
"EnableArmv9SecurityFeatures": false,
"CpuMinTargetX32": 0,
"CpuMaxTargetX32": 0,
"CpuMinTargetX64": 0,
"CpuMaxTargetX64": 0,
"CpuTargetsArm64": 512,
"OptimizeFor": 0
}
}

View File

@@ -0,0 +1,18 @@
{
"MonoBehaviour": {
"Version": 4,
"EnableBurstCompilation": true,
"EnableOptimisations": true,
"EnableSafetyChecks": false,
"EnableDebugInAllBuilds": false,
"DebugDataKind": 1,
"EnableArmv9SecurityFeatures": false,
"CpuMinTargetX32": 0,
"CpuMaxTargetX32": 0,
"CpuMinTargetX64": 0,
"CpuMaxTargetX64": 0,
"CpuTargetsX32": 6,
"CpuTargetsX64": 72,
"OptimizeFor": 0
}
}

View File

@@ -0,0 +1,16 @@
{
"MonoBehaviour": {
"Version": 4,
"EnableBurstCompilation": true,
"EnableOptimisations": true,
"EnableSafetyChecks": false,
"EnableDebugInAllBuilds": false,
"DebugDataKind": 1,
"EnableArmv9SecurityFeatures": false,
"CpuMinTargetX32": 0,
"CpuMaxTargetX32": 0,
"CpuMinTargetX64": 0,
"CpuMaxTargetX64": 0,
"OptimizeFor": 0
}
}

View File

@@ -0,0 +1,6 @@
{
"MonoBehaviour": {
"Version": 4,
"DisabledWarnings": ""
}
}

View File

@@ -8,7 +8,7 @@ EditorBuildSettings:
- enabled: 1
path: Assets/Scenes/AvoidancePerfDemo.unity
guid: 5a4ed09540a94b80bca1c7d7be0bbf31
- enabled: 1
- enabled: 0
path: Assets/Scenes/SampleScene.unity
guid: 9fc0d4010bbf28b4594072e72b8655ab
m_configObjects: {}

View File

@@ -6,7 +6,7 @@ QualitySettings:
serializedVersion: 5
m_CurrentQuality: 5
m_QualitySettings:
- serializedVersion: 2
- serializedVersion: 3
name: Very Low
pixelLightCount: 0
shadows: 0
@@ -18,17 +18,21 @@ QualitySettings:
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 0
blendWeights: 1
textureQuality: 1
skinWeights: 1
globalTextureMipmapLimit: 1
textureMipmapLimitSettings: []
anisotropicTextures: 0
antiAliasing: 0
softParticles: 0
softVegetation: 0
realtimeReflectionProbes: 0
billboardsFaceCameraPosition: 0
useLegacyDetailDistribution: 1
vSyncCount: 0
realtimeGICPUUsage: 25
lodBias: 0.3
maximumLODLevel: 0
enableLODCrossFade: 1
streamingMipmapsActive: 0
streamingMipmapsAddAllCameras: 1
streamingMipmapsMemoryBudget: 512
@@ -40,8 +44,18 @@ QualitySettings:
asyncUploadBufferSize: 16
asyncUploadPersistentBuffer: 1
resolutionScalingFixedDPIFactor: 1
customRenderPipeline: {fileID: 0}
terrainQualityOverrides: 0
terrainPixelError: 1
terrainDetailDensityScale: 1
terrainBasemapDistance: 1000
terrainDetailDistance: 80
terrainTreeDistance: 5000
terrainBillboardStart: 50
terrainFadeLength: 5
terrainMaxTrees: 50
excludedTargetPlatforms: []
- serializedVersion: 2
- serializedVersion: 3
name: Low
pixelLightCount: 0
shadows: 0
@@ -53,17 +67,21 @@ QualitySettings:
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 0
blendWeights: 2
textureQuality: 0
skinWeights: 2
globalTextureMipmapLimit: 0
textureMipmapLimitSettings: []
anisotropicTextures: 0
antiAliasing: 0
softParticles: 0
softVegetation: 0
realtimeReflectionProbes: 0
billboardsFaceCameraPosition: 0
useLegacyDetailDistribution: 1
vSyncCount: 0
realtimeGICPUUsage: 25
lodBias: 0.4
maximumLODLevel: 0
enableLODCrossFade: 1
streamingMipmapsActive: 0
streamingMipmapsAddAllCameras: 1
streamingMipmapsMemoryBudget: 512
@@ -75,8 +93,18 @@ QualitySettings:
asyncUploadBufferSize: 16
asyncUploadPersistentBuffer: 1
resolutionScalingFixedDPIFactor: 1
customRenderPipeline: {fileID: 0}
terrainQualityOverrides: 0
terrainPixelError: 1
terrainDetailDensityScale: 1
terrainBasemapDistance: 1000
terrainDetailDistance: 80
terrainTreeDistance: 5000
terrainBillboardStart: 50
terrainFadeLength: 5
terrainMaxTrees: 50
excludedTargetPlatforms: []
- serializedVersion: 2
- serializedVersion: 3
name: Medium
pixelLightCount: 1
shadows: 1
@@ -88,17 +116,21 @@ QualitySettings:
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 0
blendWeights: 2
textureQuality: 0
skinWeights: 2
globalTextureMipmapLimit: 0
textureMipmapLimitSettings: []
anisotropicTextures: 1
antiAliasing: 0
softParticles: 0
softVegetation: 0
realtimeReflectionProbes: 0
billboardsFaceCameraPosition: 0
useLegacyDetailDistribution: 1
vSyncCount: 1
realtimeGICPUUsage: 25
lodBias: 0.7
maximumLODLevel: 0
enableLODCrossFade: 1
streamingMipmapsActive: 0
streamingMipmapsAddAllCameras: 1
streamingMipmapsMemoryBudget: 512
@@ -110,8 +142,18 @@ QualitySettings:
asyncUploadBufferSize: 16
asyncUploadPersistentBuffer: 1
resolutionScalingFixedDPIFactor: 1
customRenderPipeline: {fileID: 0}
terrainQualityOverrides: 0
terrainPixelError: 1
terrainDetailDensityScale: 1
terrainBasemapDistance: 1000
terrainDetailDistance: 80
terrainTreeDistance: 5000
terrainBillboardStart: 50
terrainFadeLength: 5
terrainMaxTrees: 50
excludedTargetPlatforms: []
- serializedVersion: 2
- serializedVersion: 3
name: High
pixelLightCount: 2
shadows: 2
@@ -123,17 +165,21 @@ QualitySettings:
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 1
blendWeights: 2
textureQuality: 0
skinWeights: 2
globalTextureMipmapLimit: 0
textureMipmapLimitSettings: []
anisotropicTextures: 1
antiAliasing: 0
softParticles: 0
softVegetation: 1
realtimeReflectionProbes: 1
billboardsFaceCameraPosition: 1
useLegacyDetailDistribution: 1
vSyncCount: 1
realtimeGICPUUsage: 50
lodBias: 1
maximumLODLevel: 0
enableLODCrossFade: 1
streamingMipmapsActive: 0
streamingMipmapsAddAllCameras: 1
streamingMipmapsMemoryBudget: 512
@@ -145,8 +191,18 @@ QualitySettings:
asyncUploadBufferSize: 16
asyncUploadPersistentBuffer: 1
resolutionScalingFixedDPIFactor: 1
customRenderPipeline: {fileID: 0}
terrainQualityOverrides: 0
terrainPixelError: 1
terrainDetailDensityScale: 1
terrainBasemapDistance: 1000
terrainDetailDistance: 80
terrainTreeDistance: 5000
terrainBillboardStart: 50
terrainFadeLength: 5
terrainMaxTrees: 50
excludedTargetPlatforms: []
- serializedVersion: 2
- serializedVersion: 3
name: Very High
pixelLightCount: 3
shadows: 2
@@ -158,17 +214,21 @@ QualitySettings:
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 1
blendWeights: 4
textureQuality: 0
skinWeights: 4
globalTextureMipmapLimit: 0
textureMipmapLimitSettings: []
anisotropicTextures: 2
antiAliasing: 2
softParticles: 1
softVegetation: 1
realtimeReflectionProbes: 1
billboardsFaceCameraPosition: 1
useLegacyDetailDistribution: 1
vSyncCount: 1
realtimeGICPUUsage: 50
lodBias: 1.5
maximumLODLevel: 0
enableLODCrossFade: 1
streamingMipmapsActive: 0
streamingMipmapsAddAllCameras: 1
streamingMipmapsMemoryBudget: 512
@@ -180,8 +240,18 @@ QualitySettings:
asyncUploadBufferSize: 16
asyncUploadPersistentBuffer: 1
resolutionScalingFixedDPIFactor: 1
customRenderPipeline: {fileID: 0}
terrainQualityOverrides: 0
terrainPixelError: 1
terrainDetailDensityScale: 1
terrainBasemapDistance: 1000
terrainDetailDistance: 80
terrainTreeDistance: 5000
terrainBillboardStart: 50
terrainFadeLength: 5
terrainMaxTrees: 50
excludedTargetPlatforms: []
- serializedVersion: 2
- serializedVersion: 3
name: Ultra
pixelLightCount: 4
shadows: 2
@@ -193,17 +263,21 @@ QualitySettings:
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 1
blendWeights: 4
textureQuality: 0
skinWeights: 4
globalTextureMipmapLimit: 0
textureMipmapLimitSettings: []
anisotropicTextures: 2
antiAliasing: 2
softParticles: 1
softVegetation: 1
realtimeReflectionProbes: 1
billboardsFaceCameraPosition: 1
useLegacyDetailDistribution: 1
vSyncCount: 1
realtimeGICPUUsage: 100
lodBias: 2
maximumLODLevel: 0
enableLODCrossFade: 1
streamingMipmapsActive: 0
streamingMipmapsAddAllCameras: 1
streamingMipmapsMemoryBudget: 512
@@ -215,16 +289,28 @@ QualitySettings:
asyncUploadBufferSize: 16
asyncUploadPersistentBuffer: 1
resolutionScalingFixedDPIFactor: 1
customRenderPipeline: {fileID: 0}
terrainQualityOverrides: 0
terrainPixelError: 1
terrainDetailDensityScale: 1
terrainBasemapDistance: 1000
terrainDetailDistance: 80
terrainTreeDistance: 5000
terrainBillboardStart: 50
terrainFadeLength: 5
terrainMaxTrees: 50
excludedTargetPlatforms: []
m_TextureMipmapLimitGroupNames: []
m_PerPlatformDefaultQuality:
Android: 2
Lumin: 5
GameCoreScarlett: 5
GameCoreXboxOne: 5
Lumin: 5
Nintendo 3DS: 5
Nintendo Switch: 5
PS4: 5
PS5: 5
Server: 0
Stadia: 5
Standalone: 5
WebGL: 3

View File

@@ -0,0 +1,16 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &1
MonoBehaviour:
m_ObjectHideFlags: 53
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a287be6c49135cd4f9b2b8666c39d999, type: 3}
m_Name:
m_EditorClassIdentifier:
assetDefaultFramerate: 60
m_DefaultFrameRate: 60

View File

@@ -0,0 +1,15 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &1
MonoBehaviour:
m_ObjectHideFlags: 53
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 21f007d651ef4ab42b597f1da9ad75cf, type: 3}
m_Name:
m_EditorClassIdentifier:
hasShownWelcomeScreen: 1