Compare commits
20 Commits
4ee73e3872
...
98c8da3fd7
| Author | SHA1 | Date | |
|---|---|---|---|
| 98c8da3fd7 | |||
| b92cc7196b | |||
| b011a367e3 | |||
| 36950ca21d | |||
| 8f070ff83c | |||
| eaf3d51370 | |||
| cb26e68839 | |||
| 4302687be4 | |||
| ec0e3ce5dc | |||
| cb224be81b | |||
| 593897d978 | |||
| 27b41a37a4 | |||
| 9ca27e626a | |||
| 693f70308a | |||
| 52f0b87148 | |||
| fe8a14e539 | |||
| 3103214e76 | |||
| 011037e70c | |||
| 481cc54a28 | |||
| 81f7db0cfa |
@@ -223,4 +223,47 @@ bpy.ops.export_scene.gltf(filepath=SRC + r"\SM_<Name>.glb", export_format='GLB',
|
|||||||
use_selection=True, export_apply=True, export_yup=True)
|
use_selection=True, export_apply=True, export_yup=True)
|
||||||
```
|
```
|
||||||
Skinned/animation export → the per-action FBX recipe in [[blender-mcp-and-unity-mcp-v10]] (`bake_anim_use_all_bones`, `bake_anim_force_startend_keying`, `apply_scale_options='FBX_SCALE_UNITS'`, `add_leaf_bones=False`; Unity import `CreateFromThisModel`). **Never export into `Assets/` while a Unity session may be live** — write to `ArtSource/`, bake in later.
|
Skinned/animation export → the per-action FBX recipe in [[blender-mcp-and-unity-mcp-v10]] (`bake_anim_use_all_bones`, `bake_anim_force_startend_keying`, `apply_scale_options='FBX_SCALE_UNITS'`, `add_leaf_bones=False`; Unity import `CreateFromThisModel`). **Never export into `Assets/` while a Unity session may be live** — write to `ArtSource/`, bake in later.
|
||||||
|
|
||||||
|
## 11. In-engine verification (Unity URP render harness) — the REAL A0 check
|
||||||
|
|
||||||
|
Blender previews are a proxy; the gate is the asset in **URP** under murk + bloom + the game camera. Import + render via UnityMCP (only when the editor is free / operator granted it — else stay read-only):
|
||||||
|
1. **Import** the glb: `import_model_file(source_path=<ArtSource glb>, output_folder="Assets/_Project/Art/Models", name=...)` — needs the leading `Assets/`; glTFast handles glb + scale.
|
||||||
|
2. **Confirm the shared material samples the atlas** — the palette ShaderGraphs expose it as **`_BaseColorMap`** (NOT `_BaseMap`/`mainTexture`, so `mat.mainTexture` reads null — that's fine): `ShaderUtil` enumerate or `mat.GetTexture("_BaseColorMap")`.
|
||||||
|
3. **Render harness** (`execute_code`, C#): load the `Mesh` from the imported glb, spawn a temp GO (mesh + shared material) on an **isolated layer**, warm-key + cold-fill directional lights (`cullingMask` = that layer), murk ambient (save+restore `RenderSettings.ambientMode/ambientLight`), a temp `Camera` (SolidColor murk bg, `cullingMask` = that layer, **FOV 55**) positioned at the **game angle** and framed by `MeshRenderer.bounds`, then **`RenderPipeline.SubmitRenderRequest(cam, new StandardRequest{destination=rt})`** (URP — `Camera.Render()` is unreliable) → `ReadPixels` → `EncodeToPNG` to OS temp → `Read` the PNG. `DestroyImmediate` all temp objects; never save the open scene.
|
||||||
|
- ⚠ **Layer sign-bit:** `1<<31` is NEGATIVE → a broken culling mask that renders NOTHING (all-black). Use **layer ≤ 30**.
|
||||||
|
- ⚠ Set `cam.cullingMask` to ONLY the temp layer so the open scene's geometry doesn't leak into the shot (`~0` renders the whole scene).
|
||||||
|
- Game-cam offset from target: `(horiz*cos(pitch) + up*sin(pitch))*dist`, `horiz=(sin(yaw),0,-cos(yaw))`, pitch 45°, then `cam.transform.LookAt(center)`.
|
||||||
|
```csharp
|
||||||
|
// core render call (URP)
|
||||||
|
var rt=new UnityEngine.RenderTexture(1000,1000,24); rt.Create();
|
||||||
|
var req=new UnityEngine.Rendering.RenderPipeline.StandardRequest(); req.destination=rt;
|
||||||
|
UnityEngine.Rendering.RenderPipeline.SubmitRenderRequest(cam, req);
|
||||||
|
UnityEngine.RenderTexture.active=rt; var tex=new UnityEngine.Texture2D(1000,1000,UnityEngine.TextureFormat.RGBA32,false);
|
||||||
|
tex.ReadPixels(new UnityEngine.Rect(0,0,1000,1000),0,0); tex.Apply();
|
||||||
|
System.IO.File.WriteAllBytes(path, UnityEngine.ImageConversion.EncodeToPNG(tex));
|
||||||
|
```
|
||||||
|
**Findings from the first bake (crate):** the palette single-material pipeline works in URP; a pure-murk render reads *dark* (in-game URP bloom + scene fill lift it); grey under a warm key reads brownish (expected, not a bug). Skinned assets (suit/creatures) need the Rukhanka path + `Skinned-Palette` — hand to `/dots-dev`.
|
||||||
|
|
||||||
|
## 12. The persistent staging scene (`Assets/Scenes/ArtStaging.unity`) — the operator's in-engine view
|
||||||
|
A committed dev scene set up in the **correct A0 conditions** so the operator can OPEN it and inspect assets live (Scene-view orbit) at the gameplay angle: murk env (cold flat ambient + `ExponentialSquared` fog, no skybox), **warm-key + cold-gloam directional lights + a warm point pool**, a **Main Camera at the game angle** (pitch ~42–45°, FOV 55, `UniversalAdditionalCameraData.renderPostProcessing=true`), and a **global Volume** (profile `Assets/_Project/Art/Materials/Staging/StagingVolume.asset`: **Bloom** thr~0.85/int~1.1 — makes Emissive-Gloam glow — + **Tonemapping ACES** + **ColorAdjustments** postExposure/saturation = the capture grade), on a dark faceted pedestal. Contains labeled `SLOT_*` empties for pending assets.
|
||||||
|
- **To verify a newly-baked asset:** `import_model_file` the glb → assign the shared material (`M_Lit_Palette` statics; emissive bulbs → an HDR-emission material so bloom triggers) → `PrefabUtility.InstantiatePrefab(asset, scene)` into ArtStaging at a slot → `SaveScene` → tell the operator to open it, OR render `Camera.main` via §11.
|
||||||
|
- ⚠ Opening ArtStaging `Single` closes the active scene — only do it when the editor is free / operator-authorized (a parallel agent's scene would be swapped out). Check `editor/state` first; the scene must be clean before swapping.
|
||||||
|
- Beginner view steps to hand over: open the scene (double-click in Project ▸ Assets/Scenes), **orbit** = middle-mouse drag, **zoom** = scroll, **frame a selected object** = `F`, **Game tab** shows the gameplay-angle camera.
|
||||||
|
|
||||||
|
### Underwater ambiance recipe (built into ArtStaging — the gameplay-env prototype)
|
||||||
|
The staging env IS the gameplay ambiance (build it from real systems so it transfers). Elements that made it read "underwater" (vs a bland dark disc):
|
||||||
|
- **Caustics** = a tileable cookie on an overhead **Spot** light (dappled seabed light). Generate procedurally (sum of `Sin` interference, `pow(1-abs(n), k)` for bright ridges), save PNG, importer `wrapMode=Repeat`, `light.cookie=tex`; spot ~4.5m up, angle ~85°, cool color, intensity ~40 (spots need high intensity). ⚠ a texture `SaveAndReimport` mid-render → one BLACK frame; just re-render.
|
||||||
|
- **Marine snow** = a `ParticleSystem` (real gameplay system): World sim space, ~500 particles, `startSpeed`~0.03, tiny size, cool-white low-alpha, box shape ~9×5×9, `noise` on for wander, slight negative gravity (drift up). Renderer material = `Sprites/Default` + a generated soft-dot texture. ⚠ edit-mode doesn't auto-play — `ps.Clear(); ps.Simulate(10f,true,true); ps.Pause();` **before** rendering.
|
||||||
|
- **Depth fog** teal (`ExponentialSquared`, cool color), **cool grade** (WhiteBalance temp ~-20, Vignette dark-teal), lifted cool **ambient** (Flat ~0.09,0.16,0.20), warm-key vs cold-fill contrast + a warm point "pool" (the beacon-in-murk look).
|
||||||
|
- **Seabed dressing** = scatter real meshes (my flora as bioluminescent ground-clutter = the readability-law density dial; Synty rocks as boulders). ⚠ **Synty rocks import HUGE** (DungeonRealms boulders are multi-metre) — never scatter at raw scale; **bounds-normalize**: instantiate at scale 1, measure `MeshRenderer.bounds` max dim, `scale = targetMetres / maxDim` (target ~0.35–1.0 m), then place. Strip colliders on cosmetic dressing.
|
||||||
|
|
||||||
|
### ★ LOCKED lighting = "light is territory" (the thematic template; reads TOP-DOWN)
|
||||||
|
The direction that landed (operator-approved): **the interest lives in the LIGHTING, not geometry.**
|
||||||
|
- ⚠ **Vertical god-ray shafts DON'T read from a top-down camera** — you look straight down them. Tried, removed. For a top-down ARPG, thematic light must live in **pools ON the ground.**
|
||||||
|
- **Warm beacon pool** (a warm point light) = "our light / safe territory." **Cold bioluminescent pools** = a cold-teal point light AT each glow-flora (emissive meshes don't illuminate — add real lights). **Deep dark between** the pools (drop ambient to ~0.03,0.055,0.08, gentle key ~1.2 for form only) → chiaroscuro. This IS the "light is territory" pillar, made literal, and it reads perfectly top-down.
|
||||||
|
- **Undulating seabed mesh** (not a disc — a disc reads as a platform): procedural grid + layered `PerlinNoise` height, **damped to flat within ~2 m of the hero assets**, extended past the fog cutoff so the edge fades to murk. Flat-faceted (per-quad verts). Save as a `.asset` mesh so it persists.
|
||||||
|
- **Dynamic layer** = a Play-mode `MonoBehaviour` (`StagingAmbiance`) modulating **LIGHTS ONLY** (no material writes → nothing persists on Play exit): slow-spin the caustics spot, flicker the beacon, sine-pulse the flora pool intensities. Self-wires by `GameObject.Find`. ⚠ hitting Play in a non-menu scene runs `GameBootstrap` (spawns netcode worlds) — harmless to the visual, just background noise.
|
||||||
|
|
||||||
|
### Posed STATIC hero bake (style-proof placement without the Rukhanka pipeline)
|
||||||
|
To drop a posed suit/creature into the staging scene as a static mesh (skinned Rukhanka bake is separate `/dots-dev` work): in Blender — **apply the `Armature` modifier** on each skinned mesh (bakes the current pose into geometry), **`visual_transform_apply` + clear constraints** on bone-parented kit (eyes/lamp Child-Of), then export a static glb (meshes only, no armature). ⚠ both `modifier_apply` and `export_scene.gltf` need the **window `temp_override`** after `open_mainfile` (context.active_object). Import via `import_model_file`, `InstantiatePrefab` at the slot — glTFast carries the embedded materials (Synty atlas + emission).
|
||||||
```
|
```
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8381ebad16abf764f9b57cbc1b40d671
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
%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: 84b20ca889a744e888c8c3b3b723ec69, type: 3}
|
||||||
|
m_Name: Ability_Blink
|
||||||
|
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.AbilityDefinition
|
||||||
|
Id: 8
|
||||||
|
Archetype: 4
|
||||||
|
DisplayName: Blink
|
||||||
|
Damage: 0
|
||||||
|
ProjectileSpeed: 25
|
||||||
|
Range: 20
|
||||||
|
AutoTargetRange: 12
|
||||||
|
AutoTargetConeDegrees: 35
|
||||||
|
CooldownTicks: 1
|
||||||
|
Reel: 0
|
||||||
|
EffectDurationTicks: 0
|
||||||
|
ProjectilePrefab: {fileID: 8857056134628386430, guid: 700fb9c3f7cf94830a0ee78c4e4f1290, type: 3}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f39412c52281a3e4590f77e94c9911e7
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
%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: 84b20ca889a744e888c8c3b3b723ec69, type: 3}
|
||||||
|
m_Name: Ability_DecoyWisp
|
||||||
|
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.AbilityDefinition
|
||||||
|
Id: 5
|
||||||
|
Archetype: 3
|
||||||
|
DisplayName: Decoy Wisp
|
||||||
|
Damage: 0
|
||||||
|
ProjectileSpeed: 25
|
||||||
|
Range: 0
|
||||||
|
AutoTargetRange: 0
|
||||||
|
AutoTargetConeDegrees: 35
|
||||||
|
CooldownTicks: 360
|
||||||
|
Reel: 0
|
||||||
|
EffectDurationTicks: 480
|
||||||
|
ProjectilePrefab: {fileID: 3885353946372160549, guid: a5b1532dc1acca045856fd653fe392b9, type: 3}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c1e799ca78899bc4d97be9399233606c
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
%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: 84b20ca889a744e888c8c3b3b723ec69, type: 3}
|
||||||
|
m_Name: Ability_HookPull
|
||||||
|
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.AbilityDefinition
|
||||||
|
Id: 6
|
||||||
|
Archetype: 0
|
||||||
|
DisplayName: Hook & Pull
|
||||||
|
Damage: 15
|
||||||
|
ProjectileSpeed: 30
|
||||||
|
Range: 25
|
||||||
|
AutoTargetRange: 0
|
||||||
|
AutoTargetConeDegrees: 35
|
||||||
|
CooldownTicks: 120
|
||||||
|
Reel: 1
|
||||||
|
EffectDurationTicks: 0
|
||||||
|
ProjectilePrefab: {fileID: 8857056134628386430, guid: 700fb9c3f7cf94830a0ee78c4e4f1290, type: 3}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f57d643df7f809b40b9804bb9f8afa60
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
%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: 84b20ca889a744e888c8c3b3b723ec69, type: 3}
|
||||||
|
m_Name: Ability_LightZone
|
||||||
|
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.AbilityDefinition
|
||||||
|
Id: 9
|
||||||
|
Archetype: 3
|
||||||
|
DisplayName: Light Zone
|
||||||
|
Damage: 6
|
||||||
|
ProjectileSpeed: 25
|
||||||
|
Range: 5
|
||||||
|
AutoTargetRange: 0
|
||||||
|
AutoTargetConeDegrees: 35
|
||||||
|
CooldownTicks: 480
|
||||||
|
Reel: 0
|
||||||
|
EffectDurationTicks: 420
|
||||||
|
ProjectilePrefab: {fileID: 3885353946372160549, guid: e12b85c23fd562d49b27a3d2fdfd9cad, type: 3}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 66b9bc054810f3a4a808dd88aa2d539f
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
%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: 84b20ca889a744e888c8c3b3b723ec69, type: 3}
|
||||||
|
m_Name: Ability_Vortex
|
||||||
|
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.AbilityDefinition
|
||||||
|
Id: 7
|
||||||
|
Archetype: 3
|
||||||
|
DisplayName: Vortex
|
||||||
|
Damage: 8
|
||||||
|
ProjectileSpeed: 25
|
||||||
|
Range: 6
|
||||||
|
AutoTargetRange: 0
|
||||||
|
AutoTargetConeDegrees: 35
|
||||||
|
CooldownTicks: 420
|
||||||
|
Reel: 0
|
||||||
|
EffectDurationTicks: 300
|
||||||
|
ProjectilePrefab: {fileID: 3885353946372160549, guid: 6e31b46e818d7f348931e3d0ea73bf23, type: 3}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5e9c506bc3657b44ab7869c037a9e9ca
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7d8dd2eb5b8566a49b91ff2361b7507a
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
%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: M_EmissiveGloam_Flora
|
||||||
|
m_Shader: {fileID: 4800000, guid: 04c728537846d7a45b3e875647ea4ab0, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords: []
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 4
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
disabledShaderPasses: []
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs: []
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _FlickerAmount: 0.35
|
||||||
|
- _FlickerSpeed: 5
|
||||||
|
- _Seed: 0
|
||||||
|
m_Colors:
|
||||||
|
- _EmissionColor: {r: 0.28, g: 2.1000001, b: 3.5, a: 3.5}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 56d7d6058bb828c4f97d4b2d470512ea
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
%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: M_MarineSnow
|
||||||
|
m_Shader: {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords: []
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 4
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
disabledShaderPasses: []
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _AlphaTex:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MainTex:
|
||||||
|
m_Texture: {fileID: 2800000, guid: deb2f890371f6ca4885cacf0b23206f5, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- PixelSnap: 0
|
||||||
|
- _EnableExternalAlpha: 0
|
||||||
|
m_Colors:
|
||||||
|
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _Flip: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
- _RendererColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2d0af2456a11c9644a678ecefed106af
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
%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: M_Staging_Floor
|
||||||
|
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords: []
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 4
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap:
|
||||||
|
RenderType: Opaque
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _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}
|
||||||
|
- _SpecGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _AddPrecomputedVelocity: 0
|
||||||
|
- _AlphaClip: 0
|
||||||
|
- _AlphaToMask: 0
|
||||||
|
- _Blend: 0
|
||||||
|
- _BlendModePreserveSpecular: 1
|
||||||
|
- _BumpScale: 1
|
||||||
|
- _ClearCoatMask: 0
|
||||||
|
- _ClearCoatSmoothness: 0
|
||||||
|
- _Cull: 2
|
||||||
|
- _Cutoff: 0.5
|
||||||
|
- _DetailAlbedoMapScale: 1
|
||||||
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DstBlend: 0
|
||||||
|
- _DstBlendAlpha: 0
|
||||||
|
- _EnvironmentReflections: 1
|
||||||
|
- _GlossMapScale: 0
|
||||||
|
- _Glossiness: 0
|
||||||
|
- _GlossyReflections: 0
|
||||||
|
- _Metallic: 0
|
||||||
|
- _OcclusionStrength: 1
|
||||||
|
- _Parallax: 0.005
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _ReceiveShadows: 1
|
||||||
|
- _Smoothness: 0.5
|
||||||
|
- _SmoothnessTextureChannel: 0
|
||||||
|
- _SpecularHighlights: 1
|
||||||
|
- _SrcBlend: 1
|
||||||
|
- _SrcBlendAlpha: 1
|
||||||
|
- _Surface: 0
|
||||||
|
- _WorkflowMode: 1
|
||||||
|
- _XRMotionVectorsPass: 1
|
||||||
|
- _ZWrite: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 0.05, g: 0.06, b: 0.08, a: 1}
|
||||||
|
- _Color: {r: 0.049999982, g: 0.059999965, b: 0.079999976, a: 1}
|
||||||
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
|
--- !u!114 &5254258246720508684
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
||||||
|
version: 10
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 65e1b03298ce0b74d97127648a65a690
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
%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: M_Staging_FloraGlow
|
||||||
|
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords:
|
||||||
|
- _EMISSION
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 1
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap:
|
||||||
|
RenderType: Opaque
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _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}
|
||||||
|
- _SpecGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _AddPrecomputedVelocity: 0
|
||||||
|
- _AlphaClip: 0
|
||||||
|
- _AlphaToMask: 0
|
||||||
|
- _Blend: 0
|
||||||
|
- _BlendModePreserveSpecular: 1
|
||||||
|
- _BumpScale: 1
|
||||||
|
- _ClearCoatMask: 0
|
||||||
|
- _ClearCoatSmoothness: 0
|
||||||
|
- _Cull: 2
|
||||||
|
- _Cutoff: 0.5
|
||||||
|
- _DetailAlbedoMapScale: 1
|
||||||
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DstBlend: 0
|
||||||
|
- _DstBlendAlpha: 0
|
||||||
|
- _EnvironmentReflections: 1
|
||||||
|
- _GlossMapScale: 0
|
||||||
|
- _Glossiness: 0
|
||||||
|
- _GlossyReflections: 0
|
||||||
|
- _Metallic: 0
|
||||||
|
- _OcclusionStrength: 1
|
||||||
|
- _Parallax: 0.005
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _ReceiveShadows: 1
|
||||||
|
- _Smoothness: 0.5
|
||||||
|
- _SmoothnessTextureChannel: 0
|
||||||
|
- _SpecularHighlights: 1
|
||||||
|
- _SrcBlend: 1
|
||||||
|
- _SrcBlendAlpha: 1
|
||||||
|
- _Surface: 0
|
||||||
|
- _WorkflowMode: 1
|
||||||
|
- _XRMotionVectorsPass: 1
|
||||||
|
- _ZWrite: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 0.04, g: 0.35, b: 0.55, a: 1}
|
||||||
|
- _Color: {r: 0.04, g: 0.34999996, b: 0.54999995, a: 1}
|
||||||
|
- _EmissionColor: {r: 0.0775, g: 0.8525, b: 1.4725, a: 1.55}
|
||||||
|
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
|
--- !u!114 &1175787534491295112
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
||||||
|
version: 10
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ed09671bb3cadb7468dc20371e66a015
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &-4303757548825736843
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
||||||
|
version: 10
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 8
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: M_Staging_Rock
|
||||||
|
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords: []
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 4
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap:
|
||||||
|
RenderType: Opaque
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _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}
|
||||||
|
- _SpecGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _AddPrecomputedVelocity: 0
|
||||||
|
- _AlphaClip: 0
|
||||||
|
- _AlphaToMask: 0
|
||||||
|
- _Blend: 0
|
||||||
|
- _BlendModePreserveSpecular: 1
|
||||||
|
- _BumpScale: 1
|
||||||
|
- _ClearCoatMask: 0
|
||||||
|
- _ClearCoatSmoothness: 0
|
||||||
|
- _Cull: 2
|
||||||
|
- _Cutoff: 0.5
|
||||||
|
- _DetailAlbedoMapScale: 1
|
||||||
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DstBlend: 0
|
||||||
|
- _DstBlendAlpha: 0
|
||||||
|
- _EnvironmentReflections: 1
|
||||||
|
- _GlossMapScale: 0
|
||||||
|
- _Glossiness: 0
|
||||||
|
- _GlossyReflections: 0
|
||||||
|
- _Metallic: 0
|
||||||
|
- _OcclusionStrength: 1
|
||||||
|
- _Parallax: 0.005
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _ReceiveShadows: 1
|
||||||
|
- _Smoothness: 0.15
|
||||||
|
- _SmoothnessTextureChannel: 0
|
||||||
|
- _SpecularHighlights: 1
|
||||||
|
- _SrcBlend: 1
|
||||||
|
- _SrcBlendAlpha: 1
|
||||||
|
- _Surface: 0
|
||||||
|
- _WorkflowMode: 1
|
||||||
|
- _XRMotionVectorsPass: 1
|
||||||
|
- _ZWrite: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 0.09, g: 0.13, b: 0.16, a: 1}
|
||||||
|
- _Color: {r: 0.089999996, g: 0.12999997, b: 0.15999997, a: 1}
|
||||||
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ef1de9e539d5dce4dbf6dba546001681
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &-5413976924854781393
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
||||||
|
version: 10
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 8
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: M_Staging_Seabed
|
||||||
|
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords: []
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 4
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap:
|
||||||
|
RenderType: Opaque
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _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}
|
||||||
|
- _SpecGlossMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _AddPrecomputedVelocity: 0
|
||||||
|
- _AlphaClip: 0
|
||||||
|
- _AlphaToMask: 0
|
||||||
|
- _Blend: 0
|
||||||
|
- _BlendModePreserveSpecular: 1
|
||||||
|
- _BumpScale: 1
|
||||||
|
- _ClearCoatMask: 0
|
||||||
|
- _ClearCoatSmoothness: 0
|
||||||
|
- _Cull: 2
|
||||||
|
- _Cutoff: 0.5
|
||||||
|
- _DetailAlbedoMapScale: 1
|
||||||
|
- _DetailNormalMapScale: 1
|
||||||
|
- _DstBlend: 0
|
||||||
|
- _DstBlendAlpha: 0
|
||||||
|
- _EnvironmentReflections: 1
|
||||||
|
- _GlossMapScale: 0
|
||||||
|
- _Glossiness: 0
|
||||||
|
- _GlossyReflections: 0
|
||||||
|
- _Metallic: 0
|
||||||
|
- _OcclusionStrength: 1
|
||||||
|
- _Parallax: 0.005
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _ReceiveShadows: 1
|
||||||
|
- _Smoothness: 0.1
|
||||||
|
- _SmoothnessTextureChannel: 0
|
||||||
|
- _SpecularHighlights: 1
|
||||||
|
- _SrcBlend: 1
|
||||||
|
- _SrcBlendAlpha: 1
|
||||||
|
- _Surface: 0
|
||||||
|
- _WorkflowMode: 1
|
||||||
|
- _XRMotionVectorsPass: 1
|
||||||
|
- _ZWrite: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 0.08, g: 0.12, b: 0.15, a: 1}
|
||||||
|
- _Color: {r: 0.079999976, g: 0.11999995, b: 0.14999998, a: 1}
|
||||||
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 16d64fc7c2bf877448d870325460089a
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
%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: d7fd9488000d3734a9e00ee676215985, type: 3}
|
||||||
|
m_Name: StagingVolume
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Core.Runtime::UnityEngine.Rendering.VolumeProfile
|
||||||
|
components: []
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b41b596bf62bafa4e855a9d9b58e0dd0
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,117 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3d2906bca6d93ce46bcc432bf3452601
|
||||||
|
TextureImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 13
|
||||||
|
mipmaps:
|
||||||
|
mipMapMode: 0
|
||||||
|
enableMipMap: 1
|
||||||
|
sRGBTexture: 1
|
||||||
|
linearTexture: 0
|
||||||
|
fadeOut: 0
|
||||||
|
borderMipMap: 0
|
||||||
|
mipMapsPreserveCoverage: 0
|
||||||
|
alphaTestReferenceValue: 0.5
|
||||||
|
mipMapFadeDistanceStart: 1
|
||||||
|
mipMapFadeDistanceEnd: 3
|
||||||
|
bumpmap:
|
||||||
|
convertToNormalMap: 0
|
||||||
|
externalNormalMap: 0
|
||||||
|
heightScale: 0.25
|
||||||
|
normalMapFilter: 0
|
||||||
|
flipGreenChannel: 0
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMipmapLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 0
|
||||||
|
wrapV: 0
|
||||||
|
wrapW: 0
|
||||||
|
nPOTScale: 1
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 0
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 0
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 0
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
flipbookRows: 1
|
||||||
|
flipbookColumns: 1
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
ignorePngGamma: 0
|
||||||
|
applyGammaDecoding: 0
|
||||||
|
swizzle: 50462976
|
||||||
|
cookieLightType: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 4
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 4
|
||||||
|
buildTarget: Standalone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
customData:
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID:
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
spriteCustomMetadata:
|
||||||
|
entries: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
mipmapLimitGroupName:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,117 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: deb2f890371f6ca4885cacf0b23206f5
|
||||||
|
TextureImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 13
|
||||||
|
mipmaps:
|
||||||
|
mipMapMode: 0
|
||||||
|
enableMipMap: 1
|
||||||
|
sRGBTexture: 1
|
||||||
|
linearTexture: 0
|
||||||
|
fadeOut: 0
|
||||||
|
borderMipMap: 0
|
||||||
|
mipMapsPreserveCoverage: 0
|
||||||
|
alphaTestReferenceValue: 0.5
|
||||||
|
mipMapFadeDistanceStart: 1
|
||||||
|
mipMapFadeDistanceEnd: 3
|
||||||
|
bumpmap:
|
||||||
|
convertToNormalMap: 0
|
||||||
|
externalNormalMap: 0
|
||||||
|
heightScale: 0.25
|
||||||
|
normalMapFilter: 0
|
||||||
|
flipGreenChannel: 0
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMipmapLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 0
|
||||||
|
wrapV: 0
|
||||||
|
wrapW: 0
|
||||||
|
nPOTScale: 1
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 0
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 1
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 0
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
flipbookRows: 1
|
||||||
|
flipbookColumns: 1
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
ignorePngGamma: 0
|
||||||
|
applyGammaDecoding: 0
|
||||||
|
swizzle: 50462976
|
||||||
|
cookieLightType: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 4
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 4
|
||||||
|
buildTarget: Standalone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
customData:
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID:
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
spriteCustomMetadata:
|
||||||
|
entries: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
mipmapLimitGroupName:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 25ddd17dd88be464594be0dd21113f6c
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,32 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c00fb48df2b9d4942be61c78f056a7e4
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 11500000, guid: 715df9372183c47e389bb6e19fbc3b52, type: 3}
|
||||||
|
editorImportSettings:
|
||||||
|
generateSecondaryUVSet: 0
|
||||||
|
importSettings:
|
||||||
|
nodeNameMethod: 1
|
||||||
|
animationMethod: 2
|
||||||
|
generateMipMaps: 1
|
||||||
|
texturesReadable: 0
|
||||||
|
defaultMinFilterMode: 9729
|
||||||
|
defaultMagFilterMode: 9729
|
||||||
|
anisotropicFilterLevel: 1
|
||||||
|
instantiationSettings:
|
||||||
|
mask: -1
|
||||||
|
layer: 0
|
||||||
|
skinUpdateWhenOffscreen: 1
|
||||||
|
lightIntensityFactor: 1
|
||||||
|
sceneObjectCreation: 2
|
||||||
|
assetDependencies: []
|
||||||
|
reportItems:
|
||||||
|
- type: 2
|
||||||
|
code: 20
|
||||||
|
messages:
|
||||||
|
- KHR_materials_emissive_strength
|
||||||
Binary file not shown.
@@ -0,0 +1,32 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 65035eeeb35aa364da6924fa7a0df99a
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 11500000, guid: 715df9372183c47e389bb6e19fbc3b52, type: 3}
|
||||||
|
editorImportSettings:
|
||||||
|
generateSecondaryUVSet: 0
|
||||||
|
importSettings:
|
||||||
|
nodeNameMethod: 1
|
||||||
|
animationMethod: 2
|
||||||
|
generateMipMaps: 1
|
||||||
|
texturesReadable: 0
|
||||||
|
defaultMinFilterMode: 9729
|
||||||
|
defaultMagFilterMode: 9729
|
||||||
|
anisotropicFilterLevel: 1
|
||||||
|
instantiationSettings:
|
||||||
|
mask: -1
|
||||||
|
layer: 0
|
||||||
|
skinUpdateWhenOffscreen: 1
|
||||||
|
lightIntensityFactor: 1
|
||||||
|
sceneObjectCreation: 2
|
||||||
|
assetDependencies: []
|
||||||
|
reportItems:
|
||||||
|
- type: 2
|
||||||
|
code: 20
|
||||||
|
messages:
|
||||||
|
- KHR_materials_specular
|
||||||
Binary file not shown.
@@ -0,0 +1,32 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3f4fa1d137d34524587cca58980875e6
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 11500000, guid: 715df9372183c47e389bb6e19fbc3b52, type: 3}
|
||||||
|
editorImportSettings:
|
||||||
|
generateSecondaryUVSet: 0
|
||||||
|
importSettings:
|
||||||
|
nodeNameMethod: 1
|
||||||
|
animationMethod: 2
|
||||||
|
generateMipMaps: 1
|
||||||
|
texturesReadable: 0
|
||||||
|
defaultMinFilterMode: 9729
|
||||||
|
defaultMagFilterMode: 9729
|
||||||
|
anisotropicFilterLevel: 1
|
||||||
|
instantiationSettings:
|
||||||
|
mask: -1
|
||||||
|
layer: 0
|
||||||
|
skinUpdateWhenOffscreen: 1
|
||||||
|
lightIntensityFactor: 1
|
||||||
|
sceneObjectCreation: 2
|
||||||
|
assetDependencies: []
|
||||||
|
reportItems:
|
||||||
|
- type: 2
|
||||||
|
code: 20
|
||||||
|
messages:
|
||||||
|
- KHR_materials_emissive_strength
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 550353c68aec5d5448ec1f4ce07a2bcb
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 4300000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
@@ -0,0 +1,32 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 85e48543edab7bd46a01b4215abfe3ad
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 11500000, guid: 715df9372183c47e389bb6e19fbc3b52, type: 3}
|
||||||
|
editorImportSettings:
|
||||||
|
generateSecondaryUVSet: 0
|
||||||
|
importSettings:
|
||||||
|
nodeNameMethod: 1
|
||||||
|
animationMethod: 2
|
||||||
|
generateMipMaps: 1
|
||||||
|
texturesReadable: 0
|
||||||
|
defaultMinFilterMode: 9729
|
||||||
|
defaultMagFilterMode: 9729
|
||||||
|
anisotropicFilterLevel: 1
|
||||||
|
instantiationSettings:
|
||||||
|
mask: -1
|
||||||
|
layer: 0
|
||||||
|
skinUpdateWhenOffscreen: 1
|
||||||
|
lightIntensityFactor: 1
|
||||||
|
sceneObjectCreation: 2
|
||||||
|
assetDependencies: []
|
||||||
|
reportItems:
|
||||||
|
- type: 2
|
||||||
|
code: 20
|
||||||
|
messages:
|
||||||
|
- KHR_materials_emissive_strength
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
%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: M_Drowner_EyeGlow
|
||||||
|
m_Shader: {fileID: 4800000, guid: 04c728537846d7a45b3e875647ea4ab0, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords: []
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 4
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
disabledShaderPasses: []
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs: []
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _FlickerAmount: 0.4
|
||||||
|
- _FlickerSpeed: 5.5
|
||||||
|
- _Seed: 0
|
||||||
|
m_Colors:
|
||||||
|
- _EmissionColor: {r: 0.45000002, g: 2.85, b: 1.2, a: 3}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 69d2b2a02e92c28499c59e873ad365f8
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &-592490988042947487
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
||||||
|
version: 10
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 8
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: M_Enemy_Drowner_Animated
|
||||||
|
m_Shader: {fileID: -6465566751694194690, guid: 32ea7846f763cb340950fafed798ecf6, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords:
|
||||||
|
- _USE_VERTEX_COLOR
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 2
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseColorMap:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 936bffa65ef866a43969ea77c103adb3, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MaskMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _NormalMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _DeformedMeshIndex: 0
|
||||||
|
- _Metallic: 0
|
||||||
|
- _QueueControl: 0
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _Smoothness: 0
|
||||||
|
- _USE_VERTEX_COLOR: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 0.42, g: 0.68, b: 0.6, a: 1}
|
||||||
|
- _DeformationParamsForMotionVectors: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b8d1d410d22e6c1428f820453981f2c8
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &-592490988042947487
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
||||||
|
version: 10
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 8
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: M_Enemy_Grindylow_Animated
|
||||||
|
m_Shader: {fileID: -6465566751694194690, guid: 32ea7846f763cb340950fafed798ecf6, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords:
|
||||||
|
- _USE_VERTEX_COLOR
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 2
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseColorMap:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 936bffa65ef866a43969ea77c103adb3, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MaskMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _NormalMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _DeformedMeshIndex: 0
|
||||||
|
- _Metallic: 0
|
||||||
|
- _QueueControl: 0
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _Smoothness: 0
|
||||||
|
- _USE_VERTEX_COLOR: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 0.3, g: 0.62, b: 0.72, a: 1}
|
||||||
|
- _DeformationParamsForMotionVectors: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c59ab79e957c6a445baf8f153884da4c
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &-592490988042947487
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 11
|
||||||
|
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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
|
||||||
|
version: 10
|
||||||
|
--- !u!21 &2100000
|
||||||
|
Material:
|
||||||
|
serializedVersion: 8
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_Name: M_SuitFrame_Bathynaut_Animated
|
||||||
|
m_Shader: {fileID: -6465566751694194690, guid: 32ea7846f763cb340950fafed798ecf6, type: 3}
|
||||||
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords:
|
||||||
|
- _USE_VERTEX_COLOR
|
||||||
|
m_InvalidKeywords: []
|
||||||
|
m_LightmapFlags: 2
|
||||||
|
m_EnableInstancingVariants: 0
|
||||||
|
m_DoubleSidedGI: 0
|
||||||
|
m_CustomRenderQueue: -1
|
||||||
|
stringTagMap: {}
|
||||||
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
|
m_LockedProperties:
|
||||||
|
m_SavedProperties:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TexEnvs:
|
||||||
|
- _BaseColorMap:
|
||||||
|
m_Texture: {fileID: 2800000, guid: 936bffa65ef866a43969ea77c103adb3, type: 3}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _MaskMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- _NormalMap:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_Lightmaps:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_LightmapsInd:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
- unity_ShadowMasks:
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_Scale: {x: 1, y: 1}
|
||||||
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
|
m_Floats:
|
||||||
|
- _DeformedMeshIndex: 0
|
||||||
|
- _Metallic: 0
|
||||||
|
- _QueueControl: 0
|
||||||
|
- _QueueOffset: 0
|
||||||
|
- _Smoothness: 0
|
||||||
|
- _USE_VERTEX_COLOR: 1
|
||||||
|
m_Colors:
|
||||||
|
- _BaseColor: {r: 0.95, g: 0.9, b: 0.82, a: 1}
|
||||||
|
- _DeformationParamsForMotionVectors: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 05a7fc22c87846b4fa33c1141aad1bbf
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 2100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &2427603878820464664
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 8054832990839364730}
|
||||||
|
- component: {fileID: 7899507094755352317}
|
||||||
|
- component: {fileID: 4642700531704847346}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Model
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &8054832990839364730
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2427603878820464664}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: -0, z: -0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 2.2, y: 2.2, z: 2.2}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 3572766465862231365}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!33 &7899507094755352317
|
||||||
|
MeshFilter:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2427603878820464664}
|
||||||
|
m_Mesh: {fileID: 4300000, guid: a52e2d101bf32694d9012060774e97fd, type: 3}
|
||||||
|
--- !u!23 &4642700531704847346
|
||||||
|
MeshRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2427603878820464664}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_CastShadows: 1
|
||||||
|
m_ReceiveShadows: 1
|
||||||
|
m_DynamicOccludee: 1
|
||||||
|
m_StaticShadowCaster: 0
|
||||||
|
m_MotionVectors: 1
|
||||||
|
m_LightProbeUsage: 1
|
||||||
|
m_ReflectionProbeUsage: 1
|
||||||
|
m_RayTracingMode: 2
|
||||||
|
m_RayTraceProcedural: 0
|
||||||
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
|
m_RenderingLayerMask: 1
|
||||||
|
m_RendererPriority: 0
|
||||||
|
m_Materials:
|
||||||
|
- {fileID: 2100000, guid: 1da6f4366b5f0ed40b87287df95b5a81, type: 2}
|
||||||
|
m_StaticBatchInfo:
|
||||||
|
firstSubMesh: 0
|
||||||
|
subMeshCount: 0
|
||||||
|
m_StaticBatchRoot: {fileID: 0}
|
||||||
|
m_ProbeAnchor: {fileID: 0}
|
||||||
|
m_LightProbeVolumeOverride: {fileID: 0}
|
||||||
|
m_ScaleInLightmap: 1
|
||||||
|
m_ReceiveGI: 1
|
||||||
|
m_PreserveUVs: 0
|
||||||
|
m_IgnoreNormalsForChartDetection: 0
|
||||||
|
m_ImportantGI: 0
|
||||||
|
m_StitchLightmapSeams: 1
|
||||||
|
m_SelectedEditorRenderState: 3
|
||||||
|
m_MinimumChartSize: 4
|
||||||
|
m_AutoUVMaxDistance: 0.5
|
||||||
|
m_AutoUVMaxAngle: 89
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingLayer: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_MaskInteraction: 0
|
||||||
|
m_AdditionalVertexStreams: {fileID: 0}
|
||||||
|
--- !u!1 &3885353946372160549
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 3572766465862231365}
|
||||||
|
- component: {fileID: 9053853372340598254}
|
||||||
|
- component: {fileID: 6834786618115927220}
|
||||||
|
- component: {fileID: 1124967831263588176}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: DecoyWisp
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &3572766465862231365
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 8054832990839364730}
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &9053853372340598254
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: c16549610bfe4458aa9389201d072bb6, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.Entities.Hybrid::Unity.Entities.Hybrid.Baking.LinkedEntityGroupAuthoring
|
||||||
|
--- !u!114 &6834786618115927220
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 7c79d771cedb4794bf100ce60df5f764, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.GhostAuthoringComponent
|
||||||
|
HasOwner: 0
|
||||||
|
SupportAutoCommandTarget: 1
|
||||||
|
TrackInterpolationDelay: 0
|
||||||
|
GhostGroup: 0
|
||||||
|
UsePreSerialization: 0
|
||||||
|
UseSingleBaseline: 0
|
||||||
|
RollbackPredictedSpawnedGhostState: 0
|
||||||
|
RollbackPredictionOnStructuralChanges: 1
|
||||||
|
DefaultGhostMode: 0
|
||||||
|
SupportedGhostModes: 3
|
||||||
|
OptimizationMode: 0
|
||||||
|
Importance: 1
|
||||||
|
MaxSendRate: 0
|
||||||
|
prefabId: 8565e5eb00679fb45b8b7dac1e2ae9f3
|
||||||
|
--- !u!114 &1124967831263588176
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: fbd3e612f2e1e0a4abbd5d665943e9f2, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.DecoyAuthoring
|
||||||
|
MaxHealth: 60
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a5b1532dc1acca045856fd653fe392b9
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &2427603878820464664
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 8054832990839364730}
|
||||||
|
- component: {fileID: 7899507094755352317}
|
||||||
|
- component: {fileID: 4642700531704847346}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Model
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &8054832990839364730
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2427603878820464664}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: -0, z: -0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 2.2, y: 2.2, z: 2.2}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 3572766465862231365}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!33 &7899507094755352317
|
||||||
|
MeshFilter:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2427603878820464664}
|
||||||
|
m_Mesh: {fileID: 4300000, guid: a52e2d101bf32694d9012060774e97fd, type: 3}
|
||||||
|
--- !u!23 &4642700531704847346
|
||||||
|
MeshRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2427603878820464664}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_CastShadows: 1
|
||||||
|
m_ReceiveShadows: 1
|
||||||
|
m_DynamicOccludee: 1
|
||||||
|
m_StaticShadowCaster: 0
|
||||||
|
m_MotionVectors: 1
|
||||||
|
m_LightProbeUsage: 1
|
||||||
|
m_ReflectionProbeUsage: 1
|
||||||
|
m_RayTracingMode: 2
|
||||||
|
m_RayTraceProcedural: 0
|
||||||
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
|
m_RenderingLayerMask: 1
|
||||||
|
m_RendererPriority: 0
|
||||||
|
m_Materials:
|
||||||
|
- {fileID: 2100000, guid: 1da6f4366b5f0ed40b87287df95b5a81, type: 2}
|
||||||
|
m_StaticBatchInfo:
|
||||||
|
firstSubMesh: 0
|
||||||
|
subMeshCount: 0
|
||||||
|
m_StaticBatchRoot: {fileID: 0}
|
||||||
|
m_ProbeAnchor: {fileID: 0}
|
||||||
|
m_LightProbeVolumeOverride: {fileID: 0}
|
||||||
|
m_ScaleInLightmap: 1
|
||||||
|
m_ReceiveGI: 1
|
||||||
|
m_PreserveUVs: 0
|
||||||
|
m_IgnoreNormalsForChartDetection: 0
|
||||||
|
m_ImportantGI: 0
|
||||||
|
m_StitchLightmapSeams: 1
|
||||||
|
m_SelectedEditorRenderState: 3
|
||||||
|
m_MinimumChartSize: 4
|
||||||
|
m_AutoUVMaxDistance: 0.5
|
||||||
|
m_AutoUVMaxAngle: 89
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingLayer: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_MaskInteraction: 0
|
||||||
|
m_AdditionalVertexStreams: {fileID: 0}
|
||||||
|
--- !u!1 &3885353946372160549
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 3572766465862231365}
|
||||||
|
- component: {fileID: 9053853372340598254}
|
||||||
|
- component: {fileID: 6834786618115927220}
|
||||||
|
- component: {fileID: 8386100686141687791}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: EffectLightZone
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &3572766465862231365
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 8054832990839364730}
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &9053853372340598254
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: c16549610bfe4458aa9389201d072bb6, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.Entities.Hybrid::Unity.Entities.Hybrid.Baking.LinkedEntityGroupAuthoring
|
||||||
|
--- !u!114 &6834786618115927220
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 7c79d771cedb4794bf100ce60df5f764, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.GhostAuthoringComponent
|
||||||
|
HasOwner: 0
|
||||||
|
SupportAutoCommandTarget: 1
|
||||||
|
TrackInterpolationDelay: 0
|
||||||
|
GhostGroup: 0
|
||||||
|
UsePreSerialization: 0
|
||||||
|
UseSingleBaseline: 0
|
||||||
|
RollbackPredictedSpawnedGhostState: 0
|
||||||
|
RollbackPredictionOnStructuralChanges: 1
|
||||||
|
DefaultGhostMode: 0
|
||||||
|
SupportedGhostModes: 3
|
||||||
|
OptimizationMode: 0
|
||||||
|
Importance: 1
|
||||||
|
MaxSendRate: 0
|
||||||
|
prefabId: 8565e5eb00679fb45b8b7dac1e2ae9f3
|
||||||
|
--- !u!114 &8386100686141687791
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 491130dca5b97114cac9f21582092329, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.ZoneAuthoring
|
||||||
|
Vortex: 0
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e12b85c23fd562d49b27a3d2fdfd9cad
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &2427603878820464664
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 8054832990839364730}
|
||||||
|
- component: {fileID: 7899507094755352317}
|
||||||
|
- component: {fileID: 4642700531704847346}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Model
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &8054832990839364730
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2427603878820464664}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: -0, z: -0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 2.2, y: 2.2, z: 2.2}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 3572766465862231365}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!33 &7899507094755352317
|
||||||
|
MeshFilter:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2427603878820464664}
|
||||||
|
m_Mesh: {fileID: 4300000, guid: a52e2d101bf32694d9012060774e97fd, type: 3}
|
||||||
|
--- !u!23 &4642700531704847346
|
||||||
|
MeshRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 2427603878820464664}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_CastShadows: 1
|
||||||
|
m_ReceiveShadows: 1
|
||||||
|
m_DynamicOccludee: 1
|
||||||
|
m_StaticShadowCaster: 0
|
||||||
|
m_MotionVectors: 1
|
||||||
|
m_LightProbeUsage: 1
|
||||||
|
m_ReflectionProbeUsage: 1
|
||||||
|
m_RayTracingMode: 2
|
||||||
|
m_RayTraceProcedural: 0
|
||||||
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
|
m_RenderingLayerMask: 1
|
||||||
|
m_RendererPriority: 0
|
||||||
|
m_Materials:
|
||||||
|
- {fileID: 2100000, guid: 1da6f4366b5f0ed40b87287df95b5a81, type: 2}
|
||||||
|
m_StaticBatchInfo:
|
||||||
|
firstSubMesh: 0
|
||||||
|
subMeshCount: 0
|
||||||
|
m_StaticBatchRoot: {fileID: 0}
|
||||||
|
m_ProbeAnchor: {fileID: 0}
|
||||||
|
m_LightProbeVolumeOverride: {fileID: 0}
|
||||||
|
m_ScaleInLightmap: 1
|
||||||
|
m_ReceiveGI: 1
|
||||||
|
m_PreserveUVs: 0
|
||||||
|
m_IgnoreNormalsForChartDetection: 0
|
||||||
|
m_ImportantGI: 0
|
||||||
|
m_StitchLightmapSeams: 1
|
||||||
|
m_SelectedEditorRenderState: 3
|
||||||
|
m_MinimumChartSize: 4
|
||||||
|
m_AutoUVMaxDistance: 0.5
|
||||||
|
m_AutoUVMaxAngle: 89
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingLayer: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_MaskInteraction: 0
|
||||||
|
m_AdditionalVertexStreams: {fileID: 0}
|
||||||
|
--- !u!1 &3885353946372160549
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 3572766465862231365}
|
||||||
|
- component: {fileID: 9053853372340598254}
|
||||||
|
- component: {fileID: 6834786618115927220}
|
||||||
|
- component: {fileID: 5011981924614221947}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: EffectVortex
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &3572766465862231365
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 8054832990839364730}
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &9053853372340598254
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: c16549610bfe4458aa9389201d072bb6, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.Entities.Hybrid::Unity.Entities.Hybrid.Baking.LinkedEntityGroupAuthoring
|
||||||
|
--- !u!114 &6834786618115927220
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 7c79d771cedb4794bf100ce60df5f764, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.GhostAuthoringComponent
|
||||||
|
HasOwner: 0
|
||||||
|
SupportAutoCommandTarget: 1
|
||||||
|
TrackInterpolationDelay: 0
|
||||||
|
GhostGroup: 0
|
||||||
|
UsePreSerialization: 0
|
||||||
|
UseSingleBaseline: 0
|
||||||
|
RollbackPredictedSpawnedGhostState: 0
|
||||||
|
RollbackPredictionOnStructuralChanges: 1
|
||||||
|
DefaultGhostMode: 0
|
||||||
|
SupportedGhostModes: 3
|
||||||
|
OptimizationMode: 0
|
||||||
|
Importance: 1
|
||||||
|
MaxSendRate: 0
|
||||||
|
prefabId: 8565e5eb00679fb45b8b7dac1e2ae9f3
|
||||||
|
--- !u!114 &5011981924614221947
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3885353946372160549}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 491130dca5b97114cac9f21582092329, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.ZoneAuthoring
|
||||||
|
Vortex: 1
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6e31b46e818d7f348931e3d0ea73bf23
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 655e0ef444426ce449b2173a1e33cb44
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fd74d0edb4f42d74c9de34f4bffe351f
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 16c1d44873cc6024e8e0b48f6e811403
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -50,6 +50,8 @@ namespace ProjectM.Authoring
|
|||||||
Archetype = (byte)def.Archetype,
|
Archetype = (byte)def.Archetype,
|
||||||
AutoTargetConeRadians = math.radians(def.AutoTargetConeDegrees),
|
AutoTargetConeRadians = math.radians(def.AutoTargetConeDegrees),
|
||||||
CooldownTicks = def.CooldownTicks,
|
CooldownTicks = def.CooldownTicks,
|
||||||
|
EffectFlags = (byte)(def.Reel ? ProjectileEffectFlag.Reel : (byte)0),
|
||||||
|
DurationTicks = def.EffectDurationTicks,
|
||||||
Name = def.DisplayName,
|
Name = def.DisplayName,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ namespace ProjectM.Authoring
|
|||||||
|
|
||||||
[Header("Timing")]
|
[Header("Timing")]
|
||||||
[Min(1)] public int CooldownTicks = 12;
|
[Min(1)] public int CooldownTicks = 12;
|
||||||
|
[Header("Spark effect (LANTERN)")]
|
||||||
|
[Tooltip("HookPull: home the hit target to the caster (the Harpooner reel).")]
|
||||||
|
public bool Reel = false;
|
||||||
|
[Min(0), Tooltip("Aoe/zone + decoy lifetime in ticks (0 = system default).")]
|
||||||
|
public int EffectDurationTicks = 0;
|
||||||
|
|
||||||
[Header("Prefab (baked into the prefab buffer, not the blob)")]
|
[Header("Prefab (baked into the prefab buffer, not the blob)")]
|
||||||
public GameObject ProjectilePrefab;
|
public GameObject ProjectilePrefab;
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using ProjectM.Simulation;
|
||||||
|
using Unity.Entities;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ProjectM.Authoring
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Authoring for a decoy-wisp ghost (the LANTERN Aoe/spawn Spark). Bakes an inert <see cref="DecoyTag"/>
|
||||||
|
/// (lifetime stamped at spawn) plus the damageable set (Health + DamageEvent buffer) so Husks path to and
|
||||||
|
/// "kill" it — drawing aggro off the players (EnemyAISystem targets DecoyTag entities). NO HitRadius: the
|
||||||
|
/// decoy is NOT a projectile target, so the caster's own shots pass through it. <c>DecoySystem</c> despawns
|
||||||
|
/// it on Health <= 0 or lifetime elapse. Ghost setup (interpolated, ownerless) is inherited by duplicating
|
||||||
|
/// an existing ownerless interpolated ghost, so position replicates via the stock LocalTransform variant.
|
||||||
|
/// </summary>
|
||||||
|
public class DecoyAuthoring : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Min(1f), Tooltip("Decoy hit points — how much aggro/melee it soaks before popping.")]
|
||||||
|
public float MaxHealth = 60f;
|
||||||
|
|
||||||
|
private class DecoyBaker : Baker<DecoyAuthoring>
|
||||||
|
{
|
||||||
|
public override void Bake(DecoyAuthoring authoring)
|
||||||
|
{
|
||||||
|
var entity = GetEntity(authoring, TransformUsageFlags.Dynamic);
|
||||||
|
AddComponent<DecoyTag>(entity); // ExpireTick stamped at spawn by AbilityFireSystem
|
||||||
|
AddComponent(entity, new Health { Current = authoring.MaxHealth, Max = authoring.MaxHealth });
|
||||||
|
AddBuffer<DamageEvent>(entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fbd3e612f2e1e0a4abbd5d665943e9f2
|
||||||
@@ -51,6 +51,7 @@ namespace ProjectM.Authoring
|
|||||||
});
|
});
|
||||||
AddComponent(entity, new EnemyAttackCooldown { NextAttackTick = 0 });
|
AddComponent(entity, new EnemyAttackCooldown { NextAttackTick = 0 });
|
||||||
AddComponent<KnockbackState>(entity); // server-only recoil state (zero = not knocked)
|
AddComponent<KnockbackState>(entity); // server-only recoil state (zero = not knocked)
|
||||||
|
AddComponent<ReelState>(entity); // server-only Harpooner-reel homing state (baked inert; stamped on a Reel-flag hit; NOT a GhostField)
|
||||||
AddComponent(entity, new EnemyNavState { LastPos = float.MaxValue }); // server-only anti-stuck nav state (not replicated); sentinel LastPos forces a first-tick reset
|
AddComponent(entity, new EnemyNavState { LastPos = float.MaxValue }); // server-only anti-stuck nav state (not replicated); sentinel LastPos forces a first-tick reset
|
||||||
AddComponent<AttackWindup>(entity); // replicated telegraph signal (zero = not winding up)
|
AddComponent<AttackWindup>(entity); // replicated telegraph signal (zero = not winding up)
|
||||||
// Slice 1 (Feature C): client-safe baked telegraph metadata. EnemyBaker is the SOLE writer of
|
// Slice 1 (Feature C): client-safe baked telegraph metadata. EnemyBaker is the SOLE writer of
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using ProjectM.Simulation;
|
||||||
|
using Unity.Entities;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ProjectM.Authoring
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Authoring for a player-cast ZONE ghost (Vortex / LightZone — the LANTERN Aoe/zone Sparks). Bakes an inert
|
||||||
|
/// <see cref="ZoneEffect"/>; the runtime values (caster / radius / damage / lifetime) are stamped at spawn by
|
||||||
|
/// <c>AbilityFireSystem</c> — only the Vortex FLAG is authored here (so <c>AbilityFireSystem</c> can pick
|
||||||
|
/// ZoneEffect vs DecoyTag by prefab membership, and the pull behaviour is baked-in). The prefab's ghost setup
|
||||||
|
/// (GhostAuthoringComponent: interpolated, ownerless) is inherited by DUPLICATING an existing ownerless
|
||||||
|
/// interpolated ghost, so it replicates to all clients via the stock LocalTransform variant (no hand-written
|
||||||
|
/// <c>[GhostField]</c>). <c>GetEntity(Dynamic)</c> gives a runtime-mutable LocalTransform for the spawn override.
|
||||||
|
/// </summary>
|
||||||
|
public class ZoneAuthoring : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Tooltip("Vortex: pull enemies toward the zone centre each tick (in addition to the periodic damage).")]
|
||||||
|
public bool Vortex = false;
|
||||||
|
|
||||||
|
private class ZoneBaker : Baker<ZoneAuthoring>
|
||||||
|
{
|
||||||
|
public override void Bake(ZoneAuthoring authoring)
|
||||||
|
{
|
||||||
|
var entity = GetEntity(authoring, TransformUsageFlags.Dynamic);
|
||||||
|
AddComponent(entity, new ZoneEffect
|
||||||
|
{
|
||||||
|
Flags = authoring.Vortex ? ZoneEffectFlag.Vortex : (byte)0,
|
||||||
|
// caster / radius / damage / NextTick / ExpireTick are seeded at spawn by AbilityFireSystem.
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 491130dca5b97114cac9f21582092329
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ada099036105741448f2c567a6324e8f
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using ProjectM.Simulation;
|
||||||
|
using Unity.Entities;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ProjectM.Authoring
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Bakes the Enemy-test GYM singletons: the <see cref="GymTag"/> mode switch + the <see cref="GymEnemyRoster"/>
|
||||||
|
/// buffer of on-demand-spawnable enemy prefabs (Drowner / Grindylow — the ready skinned prefabs). Place ONE in
|
||||||
|
/// the gym subscene. Each prefab must be a baked ghost (interpolated ownerless enemy, EnemyAuthoring-based). The
|
||||||
|
/// SpawnEnemy dev op instantiates the row whose Kind matches the request.
|
||||||
|
/// </summary>
|
||||||
|
public class GymRosterAuthoring : MonoBehaviour
|
||||||
|
{
|
||||||
|
[System.Serializable]
|
||||||
|
public struct Entry
|
||||||
|
{
|
||||||
|
[Tooltip("Stable kind id (0 = Drowner, 1 = Grindylow).")]
|
||||||
|
public byte Kind;
|
||||||
|
public GameObject Prefab;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Tooltip("On-demand-spawnable enemy prefabs, one row per kind.")]
|
||||||
|
public List<Entry> Enemies = new List<Entry>();
|
||||||
|
|
||||||
|
private class RosterBaker : Baker<GymRosterAuthoring>
|
||||||
|
{
|
||||||
|
public override void Bake(GymRosterAuthoring authoring)
|
||||||
|
{
|
||||||
|
var entity = GetEntity(TransformUsageFlags.None);
|
||||||
|
AddComponent<GymTag>(entity);
|
||||||
|
var buf = AddBuffer<GymEnemyRoster>(entity);
|
||||||
|
if (authoring.Enemies != null)
|
||||||
|
{
|
||||||
|
foreach (var e in authoring.Enemies)
|
||||||
|
{
|
||||||
|
if (e.Prefab == null) continue;
|
||||||
|
buf.Add(new GymEnemyRoster
|
||||||
|
{
|
||||||
|
Kind = e.Kind,
|
||||||
|
Prefab = GetEntity(e.Prefab, TransformUsageFlags.Dynamic),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d210e424c43414a4e958efc44c025335
|
||||||
@@ -44,6 +44,9 @@ namespace ProjectM.Client
|
|||||||
public static void SetClass(byte classId) => Send(DebugOp.SetClass, classId);
|
public static void SetClass(byte classId) => Send(DebugOp.SetClass, classId);
|
||||||
public static void SetWarrior() => SetClass(ClassTraits.WarriorClass);
|
public static void SetWarrior() => SetClass(ClassTraits.WarriorClass);
|
||||||
public static void SetRanger() => SetClass(ClassTraits.RangerClass);
|
public static void SetRanger() => SetClass(ClassTraits.RangerClass);
|
||||||
|
/// <summary>GYM: spawn enemy KIND (a <see cref="ProjectM.Simulation.GymEnemyKind"/> byte) near the sender, count times.</summary>
|
||||||
|
public static void SpawnEnemy(byte kind, int count = 1) => Send(DebugOp.SpawnEnemy, kind, count);
|
||||||
|
|
||||||
|
|
||||||
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
|
||||||
static void ResetOnEnterPlayMode() => s_Pending.Clear();
|
static void ResetOnEnterPlayMode() => s_Pending.Clear();
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ProjectM.Client
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Dev-only ambiance animator for the ArtStaging scene. Play-mode; modulates LIGHTS only
|
||||||
|
/// (no material/asset writes) so nothing persists on Play exit. Self-wires by object name.
|
||||||
|
/// </summary>
|
||||||
|
[DisallowMultipleComponent]
|
||||||
|
public sealed class StagingAmbiance : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Caustics")]
|
||||||
|
public float causticsSpinDegPerSec = 4f;
|
||||||
|
|
||||||
|
[Header("Warm beacon flicker")]
|
||||||
|
public float beaconFlickerAmount = 0.06f;
|
||||||
|
|
||||||
|
[Header("Bioluminescent pulse")]
|
||||||
|
public float floraPulseAmount = 0.22f;
|
||||||
|
public float floraPulseSpeed = 1.4f;
|
||||||
|
|
||||||
|
Transform _caustics;
|
||||||
|
Light _beacon; float _beaconBase;
|
||||||
|
Light[] _flora; float[] _floraBase;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
var c = GameObject.Find("CausticsSpot");
|
||||||
|
if (c != null) _caustics = c.transform;
|
||||||
|
|
||||||
|
var b = GameObject.Find("WarmPool");
|
||||||
|
if (b != null) { _beacon = b.GetComponent<Light>(); if (_beacon != null) _beaconBase = _beacon.intensity; }
|
||||||
|
|
||||||
|
var fl = GameObject.Find("FloraLights");
|
||||||
|
if (fl != null)
|
||||||
|
{
|
||||||
|
_flora = fl.GetComponentsInChildren<Light>();
|
||||||
|
_floraBase = new float[_flora.Length];
|
||||||
|
for (int i = 0; i < _flora.Length; i++) _floraBase[i] = _flora[i].intensity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
float t = Time.time;
|
||||||
|
|
||||||
|
// caustics slowly drift across the seabed
|
||||||
|
if (_caustics != null)
|
||||||
|
_caustics.Rotate(0f, causticsSpinDegPerSec * Time.deltaTime, 0f, Space.World);
|
||||||
|
|
||||||
|
// readability law: STEADY = true light. The warm beacon is left unmodulated (steady) on purpose.
|
||||||
|
// FLICKER = false/counterfeit light -> the cold gloam pools gutter with organic Perlin flicker,
|
||||||
|
// so "ours vs the deep's" reads through cadence even with hue/value removed.
|
||||||
|
if (_flora != null)
|
||||||
|
for (int i = 0; i < _flora.Length; i++)
|
||||||
|
{
|
||||||
|
float phase = i * 3.1f;
|
||||||
|
float flick = 0.55f + 0.45f * Mathf.PerlinNoise(t * floraPulseSpeed * 1.8f + phase, phase * 0.7f);
|
||||||
|
_flora[i].intensity = _floraBase[i] * flick;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: abe491d4d98103f4ab08712d8a78a1eb
|
||||||
@@ -81,6 +81,55 @@ namespace ProjectM.EditorTools
|
|||||||
Debug.Log("[EnemyRigTools] Charger built -> EnemyChargerMuscle.prefab; add it to WaveDirector.EnemyPrefabs[] in the gameplay subscene.");
|
Debug.Log("[EnemyRigTools] Charger built -> EnemyChargerMuscle.prefab; add it to WaveDirector.EnemyPrefabs[] in the gameplay subscene.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>LANTERN Drowner: SciFiSpace Crew_Male body (SAME rig/atlas/avatar as the player) via the standard
|
||||||
|
/// DR-023 path, gloam-pallor tint. Reuses the committed AC_EnemyTopDown controller. Template = grunt Enemy.prefab
|
||||||
|
/// (kind Grunt). RootY -1.13 (~ -0.9 player offset / 0.8 template scale) - tune feet in Play.</summary>
|
||||||
|
[MenuItem("ProjectM/Animation/Enemy Rigs - Build Drowner (LANTERN)")]
|
||||||
|
public static void BuildDrowner()
|
||||||
|
{
|
||||||
|
const string atlas = "Assets/Synty/PolygonSciFiSpace/Textures/PolygonSciFiSpace_Texture_01_A.png";
|
||||||
|
const string mat = "Assets/_Project/Materials/M_Enemy_Drowner_Animated.mat";
|
||||||
|
const string synty = "Assets/Synty/PolygonSciFiSpace/Prefabs/Characters/SM_Chr_Crew_Male_01.prefab";
|
||||||
|
MakeMat(mat, atlas, new Color(0.42f, 0.68f, 0.6f, 1f)); // drowned gloam pallor (cold sickly teal-green)
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
BuildOne(new Variant { Name = "Drowner (SciFiSpace Crew)", Template = "Assets/_Project/Prefabs/Enemy.prefab", Synty = synty, Output = "Assets/_Project/Prefabs/EnemyDrowner.prefab", Material = mat, RootY = -1.13f, Scale = 0f });
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
Debug.Log("[EnemyRigTools] Drowner built -> EnemyDrowner.prefab; add to WaveDirector.EnemyPrefabs[] to spawn it.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>LANTERN Grindylow (2nd creature = A1 repeatability): SciFiSpace Alien body, cold gloam-blue, same path.</summary>
|
||||||
|
[MenuItem("ProjectM/Animation/Enemy Rigs - Build Grindylow (LANTERN)")]
|
||||||
|
public static void BuildGrindylow()
|
||||||
|
{
|
||||||
|
const string atlas = "Assets/Synty/PolygonSciFiSpace/Textures/PolygonSciFiSpace_Texture_01_A.png";
|
||||||
|
const string mat = "Assets/_Project/Materials/M_Enemy_Grindylow_Animated.mat";
|
||||||
|
const string synty = "Assets/Synty/PolygonSciFiSpace/Prefabs/Characters/SM_Chr_Alien_01.prefab";
|
||||||
|
MakeMat(mat, atlas, new Color(0.30f, 0.62f, 0.72f, 1f)); // cold gloam-blue deep-thing
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
BuildOne(new Variant { Name = "Grindylow (SciFiSpace Alien)", Template = "Assets/_Project/Prefabs/Enemy.prefab", Synty = synty, Output = "Assets/_Project/Prefabs/EnemyGrindylow.prefab", Material = mat, RootY = -1.13f, Scale = 0f });
|
||||||
|
AssetDatabase.SaveAssets(); AssetDatabase.Refresh();
|
||||||
|
Debug.Log("[EnemyRigTools] Grindylow built -> EnemyGrindylow.prefab.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Bathynaut suit-frame PREVIEW: armored+helmeted soldier body, warm-neutral (ours, not gloam). Built on the
|
||||||
|
/// enemy chassis to PROVE the suit body skins+animates via Rukhanka; player-frame integration (swap into Player.prefab)
|
||||||
|
/// is a separate step, and the custom brass diving kit is an A3 silhouette upgrade.</summary>
|
||||||
|
[MenuItem("ProjectM/Animation/Enemy Rigs - Build Bathynaut Suit-Frame (LANTERN)")]
|
||||||
|
public static void BuildBathynautFrame()
|
||||||
|
{
|
||||||
|
const string atlas = "Assets/Synty/PolygonSciFiSpace/Textures/PolygonSciFiSpace_Texture_01_A.png";
|
||||||
|
const string mat = "Assets/_Project/Materials/M_SuitFrame_Bathynaut_Animated.mat";
|
||||||
|
const string synty = "Assets/Synty/PolygonSciFiSpace/Prefabs/Characters/SM_Chr_SpaceSoldier_HelmetArmor_Male_01.prefab";
|
||||||
|
MakeMat(mat, atlas, new Color(0.95f, 0.90f, 0.82f, 1f)); // warm-neutral: our light, not gloam-tinted
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
BuildOne(new Variant { Name = "Bathynaut Suit-Frame", Template = "Assets/_Project/Prefabs/Enemy.prefab", Synty = synty, Output = "Assets/_Project/Prefabs/SuitFrame_Bathynaut.prefab", Material = mat, RootY = -1.13f, Scale = 0f });
|
||||||
|
AssetDatabase.SaveAssets(); AssetDatabase.Refresh();
|
||||||
|
Debug.Log("[EnemyRigTools] Bathynaut suit-frame preview built -> SuitFrame_Bathynaut.prefab (not wired to the player).");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ---- 1. Materials ------------------------------------------------------------------------------------
|
// ---- 1. Materials ------------------------------------------------------------------------------------
|
||||||
|
|
||||||
[MenuItem("ProjectM/Animation/Enemy Rigs - 1 Build Materials")]
|
[MenuItem("ProjectM/Animation/Enemy Rigs - 1 Build Materials")]
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using ProjectM.Simulation;
|
||||||
|
using Unity.Burst;
|
||||||
|
using Unity.Collections;
|
||||||
|
using Unity.Entities;
|
||||||
|
using Unity.NetCode;
|
||||||
|
|
||||||
|
namespace ProjectM.Server
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// SERVER-ONLY decoy-wisp lifecycle: despawns a decoy ghost when its Health is spent (Husks "killed" it) or
|
||||||
|
/// its <see cref="DecoyTag.ExpireTick"/> lifetime elapses. Server-authoritative ghost despawn (the client's
|
||||||
|
/// copy is removed by GhostSendSystem — never DestroyEntity a ghost client-side). The decoy draws aggro via
|
||||||
|
/// <c>EnemyAISystem</c>'s decoy target set; this system only ends its life. Presence-gated on DecoyTag.
|
||||||
|
/// </summary>
|
||||||
|
[BurstCompile]
|
||||||
|
[WorldSystemFilter(WorldSystemFilterFlags.ServerSimulation)]
|
||||||
|
[UpdateInGroup(typeof(SimulationSystemGroup))]
|
||||||
|
public partial struct DecoySystem : ISystem
|
||||||
|
{
|
||||||
|
[BurstCompile]
|
||||||
|
public void OnCreate(ref SystemState state)
|
||||||
|
{
|
||||||
|
state.RequireForUpdate<NetworkTime>();
|
||||||
|
state.RequireForUpdate<DecoyTag>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[BurstCompile]
|
||||||
|
public void OnUpdate(ref SystemState state)
|
||||||
|
{
|
||||||
|
var serverTick = SystemAPI.GetSingleton<NetworkTime>().ServerTick;
|
||||||
|
if (!serverTick.IsValid) return;
|
||||||
|
var ecb = new EntityCommandBuffer(Allocator.Temp);
|
||||||
|
foreach (var (decoy, hp, e) in
|
||||||
|
SystemAPI.Query<RefRO<DecoyTag>, RefRO<Health>>().WithEntityAccess())
|
||||||
|
{
|
||||||
|
bool expired = decoy.ValueRO.ExpireTick != 0u
|
||||||
|
&& !new NetworkTick(decoy.ValueRO.ExpireTick).IsNewerThan(serverTick);
|
||||||
|
if (hp.ValueRO.Current <= 0f || expired)
|
||||||
|
ecb.DestroyEntity(e);
|
||||||
|
}
|
||||||
|
ecb.Playback(state.EntityManager);
|
||||||
|
ecb.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 355ca71da85a0f444bb9c312c4dc4643
|
||||||
@@ -73,6 +73,17 @@ namespace ProjectM.Server
|
|||||||
structurePositions.Add(sx.ValueRO.Position);
|
structurePositions.Add(sx.ValueRO.Position);
|
||||||
structureRegions.Add(sr.ValueRO.Region);
|
structureRegions.Add(sr.ValueRO.Region);
|
||||||
}
|
}
|
||||||
|
// LANTERN decoy-wisp aggro: a decoy draws Husks like a fake target. Region-agnostic gather (gym).
|
||||||
|
var decoyEntities = new NativeList<Entity>(Allocator.Temp);
|
||||||
|
var decoyPositions = new NativeList<float3>(Allocator.Temp);
|
||||||
|
foreach (var (dx, dh, de) in
|
||||||
|
SystemAPI.Query<RefRO<LocalTransform>, RefRO<Health>>()
|
||||||
|
.WithAll<DecoyTag>().WithEntityAccess())
|
||||||
|
{
|
||||||
|
if (dh.ValueRO.Current <= 0f) continue; // a spent decoy is being despawned; don't aggro a corpse
|
||||||
|
decoyEntities.Add(de);
|
||||||
|
decoyPositions.Add(dx.ValueRO.Position);
|
||||||
|
}
|
||||||
|
|
||||||
// END-1: the Engine Core is a FALLBACK target. When no living player/structure remains, undefended
|
// END-1: the Engine Core is a FALLBACK target. When no living player/structure remains, undefended
|
||||||
// Husks march on the base heart (PlotCenter) so the base can be overrun instead of the swarm idling.
|
// Husks march on the base heart (PlotCenter) so the base can be overrun instead of the swarm idling.
|
||||||
@@ -80,7 +91,7 @@ namespace ProjectM.Server
|
|||||||
&& SystemAPI.TryGetSingleton<CoreIntegrity>(out var coreInteg) && coreInteg.Current > 0;
|
&& SystemAPI.TryGetSingleton<CoreIntegrity>(out var coreInteg) && coreInteg.Current > 0;
|
||||||
float3 corePos = coreAlive ? BaseGridMath.PlotCenter(SystemAPI.GetSingleton<BaseAnchor>()) : float3.zero;
|
float3 corePos = coreAlive ? BaseGridMath.PlotCenter(SystemAPI.GetSingleton<BaseAnchor>()) : float3.zero;
|
||||||
|
|
||||||
if (playerEntities.Length == 0 && structureEntities.Length == 0 && !coreAlive)
|
if (playerEntities.Length == 0 && structureEntities.Length == 0 && decoyEntities.Length == 0 && !coreAlive)
|
||||||
{
|
{
|
||||||
playerEntities.Dispose();
|
playerEntities.Dispose();
|
||||||
playerPositions.Dispose();
|
playerPositions.Dispose();
|
||||||
@@ -88,12 +99,15 @@ namespace ProjectM.Server
|
|||||||
structureEntities.Dispose();
|
structureEntities.Dispose();
|
||||||
structurePositions.Dispose();
|
structurePositions.Dispose();
|
||||||
structureRegions.Dispose();
|
structureRegions.Dispose();
|
||||||
|
decoyEntities.Dispose();
|
||||||
|
decoyPositions.Dispose();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float dt = SystemAPI.Time.DeltaTime;
|
float dt = SystemAPI.Time.DeltaTime;
|
||||||
var serverTick = SystemAPI.GetSingleton<NetworkTime>().ServerTick;
|
var serverTick = SystemAPI.GetSingleton<NetworkTime>().ServerTick;
|
||||||
uint now = serverTick.TickIndexForValidTick;
|
uint now = serverTick.TickIndexForValidTick;
|
||||||
|
float decoyAggroSq = 30f * 30f; // LANTERN decoy-wisp aggro radius (world units, squared)
|
||||||
// Live feel knobs (MC-0): one read, guarded at use. Server-only — clients never simulate enemies.
|
// Live feel knobs (MC-0): one read, guarded at use. Server-only — clients never simulate enemies.
|
||||||
var tune = SystemAPI.TryGetSingleton<TuningConfig>(out var tcfg) ? tcfg : TuningConfig.Defaults();
|
var tune = SystemAPI.TryGetSingleton<TuningConfig>(out var tcfg) ? tcfg : TuningConfig.Defaults();
|
||||||
float structAggro = math.max(0f, tune.StructureAggroWeight);
|
float structAggro = math.max(0f, tune.StructureAggroWeight);
|
||||||
@@ -147,12 +161,30 @@ namespace ProjectM.Server
|
|||||||
// EB-1 fortress aggro: nearest of players (weight 1) + structures (StructureAggroWeight) — a wall/
|
// EB-1 fortress aggro: nearest of players (weight 1) + structures (StructureAggroWeight) — a wall/
|
||||||
// turret is the preferred target unless a player is in the way (closer after weighting).
|
// turret is the preferred target unless a player is in the way (closer after weighting).
|
||||||
EnemyAIMath.PickWeightedNearest(pos, playerPositions, playerRegions, structurePositions, structureRegions, huskRegion, structAggro, out bool tgtIsStruct, out int tgtIdx);
|
EnemyAIMath.PickWeightedNearest(pos, playerPositions, playerRegions, structurePositions, structureRegions, huskRegion, structAggro, out bool tgtIsStruct, out int tgtIdx);
|
||||||
|
// Decoy aggro (LANTERN): a decoy-wisp within range is the PREFERRED target -- overrides player/structure/core.
|
||||||
|
int decoyIdx = -1;
|
||||||
|
float decoyBestSq = decoyAggroSq;
|
||||||
|
for (int di = 0; di < decoyPositions.Length; di++)
|
||||||
|
{
|
||||||
|
float dsq = math.distancesq(pos.xz, decoyPositions[di].xz);
|
||||||
|
if (dsq <= decoyBestSq) { decoyBestSq = dsq; decoyIdx = di; }
|
||||||
|
}
|
||||||
|
Entity targetEntity;
|
||||||
|
float3 targetPos;
|
||||||
|
if (decoyIdx >= 0)
|
||||||
|
{
|
||||||
|
targetEntity = decoyEntities[decoyIdx];
|
||||||
|
targetPos = decoyPositions[decoyIdx];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (tgtIdx < 0 && !huskCoreAlive)
|
if (tgtIdx < 0 && !huskCoreAlive)
|
||||||
continue; // no player/structure and no Core -> nothing to seek
|
continue; // no decoy, no player/structure, and no Core -> nothing to seek
|
||||||
Entity targetEntity = tgtIdx < 0 ? Entity.Null
|
targetEntity = tgtIdx < 0 ? Entity.Null
|
||||||
: (tgtIsStruct ? structureEntities[tgtIdx] : playerEntities[tgtIdx]);
|
: (tgtIsStruct ? structureEntities[tgtIdx] : playerEntities[tgtIdx]);
|
||||||
float3 targetPos = tgtIdx < 0 ? corePos
|
targetPos = tgtIdx < 0 ? corePos
|
||||||
: (tgtIsStruct ? structurePositions[tgtIdx] : playerPositions[tgtIdx]);
|
: (tgtIsStruct ? structurePositions[tgtIdx] : playerPositions[tgtIdx]);
|
||||||
|
}
|
||||||
|
|
||||||
// Seek: stop just inside strike range so the Husk holds position to attack.
|
// Seek: stop just inside strike range so the Husk holds position to attack.
|
||||||
float stopDistance = stats.ValueRO.AttackRange * 0.9f;
|
float stopDistance = stats.ValueRO.AttackRange * 0.9f;
|
||||||
@@ -665,6 +697,8 @@ namespace ProjectM.Server
|
|||||||
structureEntities.Dispose();
|
structureEntities.Dispose();
|
||||||
structurePositions.Dispose();
|
structurePositions.Dispose();
|
||||||
structureRegions.Dispose();
|
structureRegions.Dispose();
|
||||||
|
decoyEntities.Dispose();
|
||||||
|
decoyPositions.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Swept collide-and-slide for server-authoritative enemy movement — delegates to the shared
|
// Swept collide-and-slide for server-authoritative enemy movement — delegates to the shared
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ namespace ProjectM.Server
|
|||||||
/// <summary>RW lookup to stamp server-only knockback on a hit Husk (Husks bake KnockbackState; players/dummies don't).</summary>
|
/// <summary>RW lookup to stamp server-only knockback on a hit Husk (Husks bake KnockbackState; players/dummies don't).</summary>
|
||||||
ComponentLookup<KnockbackState> m_KnockbackLookup;
|
ComponentLookup<KnockbackState> m_KnockbackLookup;
|
||||||
|
|
||||||
|
/// <summary>RW lookup to stamp the server-only homing ReelState on a Reel-flagged (HookPull) hit — the Harpooner reel.</summary>
|
||||||
|
ComponentLookup<ReelState> m_ReelLookup;
|
||||||
|
|
||||||
/// <summary>Read-only lookup so a BOSS (BossState) is skipped by the knockback stamp — the boss is
|
/// <summary>Read-only lookup so a BOSS (BossState) is skipped by the knockback stamp — the boss is
|
||||||
/// knockback-immune (A4) so a solo player can't perma-stunlock it out of its slam wind-ups.</summary>
|
/// knockback-immune (A4) so a solo player can't perma-stunlock it out of its slam wind-ups.</summary>
|
||||||
ComponentLookup<BossState> m_BossLookup;
|
ComponentLookup<BossState> m_BossLookup;
|
||||||
@@ -62,11 +65,18 @@ namespace ProjectM.Server
|
|||||||
/// <summary>Max planar distance a Ricochet chain will reach for its next target (tunable).</summary>
|
/// <summary>Max planar distance a Ricochet chain will reach for its next target (tunable).</summary>
|
||||||
const float k_ChainRange = 8f;
|
const float k_ChainRange = 8f;
|
||||||
|
|
||||||
|
/// <summary>Harpooner reel pull speed (world units/sec) written into the reeled Husk's KnockbackState.</summary>
|
||||||
|
const float k_ReelSpeed = 16f;
|
||||||
|
|
||||||
|
/// <summary>Reel leash: max ticks the homing pull lasts before releasing (~60 ticks/sec).</summary>
|
||||||
|
const uint k_ReelLeashTicks = 90u;
|
||||||
|
|
||||||
[BurstCompile]
|
[BurstCompile]
|
||||||
public void OnCreate(ref SystemState state)
|
public void OnCreate(ref SystemState state)
|
||||||
{
|
{
|
||||||
m_GhostOwnerLookup = state.GetComponentLookup<GhostOwner>(isReadOnly: true);
|
m_GhostOwnerLookup = state.GetComponentLookup<GhostOwner>(isReadOnly: true);
|
||||||
m_KnockbackLookup = state.GetComponentLookup<KnockbackState>(isReadOnly: false);
|
m_KnockbackLookup = state.GetComponentLookup<KnockbackState>(isReadOnly: false);
|
||||||
|
m_ReelLookup = state.GetComponentLookup<ReelState>(isReadOnly: false);
|
||||||
m_BossLookup = state.GetComponentLookup<BossState>(isReadOnly: true);
|
m_BossLookup = state.GetComponentLookup<BossState>(isReadOnly: true);
|
||||||
m_FxLookup = state.GetComponentLookup<ProjectileEffectState>(isReadOnly: false);
|
m_FxLookup = state.GetComponentLookup<ProjectileEffectState>(isReadOnly: false);
|
||||||
|
|
||||||
@@ -79,6 +89,7 @@ namespace ProjectM.Server
|
|||||||
{
|
{
|
||||||
m_GhostOwnerLookup.Update(ref state);
|
m_GhostOwnerLookup.Update(ref state);
|
||||||
m_KnockbackLookup.Update(ref state);
|
m_KnockbackLookup.Update(ref state);
|
||||||
|
m_ReelLookup.Update(ref state);
|
||||||
m_BossLookup.Update(ref state);
|
m_BossLookup.Update(ref state);
|
||||||
m_FxLookup.Update(ref state);
|
m_FxLookup.Update(ref state);
|
||||||
|
|
||||||
@@ -165,8 +176,21 @@ namespace ProjectM.Server
|
|||||||
SourceTick = haveTick ? TickUtil.NonZero(nt.ServerTick.TickIndexForValidTick) : 0u,
|
SourceTick = haveTick ? TickUtil.NonZero(nt.ServerTick.TickIndexForValidTick) : 0u,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Knockback (Phase 1.7: PULL flips the heading toward the shooter when the owner's boon is set).
|
// Knockback / REEL. Reel (HookPull) stamps the HOMING ReelState (ReelSystem re-aims toward the
|
||||||
if (haveTick && Tuning.KnockbackSpeed > 0f && m_KnockbackLookup.HasComponent(hitTarget) && !m_BossLookup.HasComponent(hitTarget))
|
// caster's live position each tick); otherwise the classic frozen knockback (PULL flips toward the shooter).
|
||||||
|
if (haveTick && m_KnockbackLookup.HasComponent(hitTarget) && !m_BossLookup.HasComponent(hitTarget))
|
||||||
|
{
|
||||||
|
bool reel = hasFx && (fx.Flags & ProjectileEffectFlag.Reel) != 0;
|
||||||
|
if (reel && m_ReelLookup.HasComponent(hitTarget))
|
||||||
|
{
|
||||||
|
m_ReelLookup[hitTarget] = new ReelState
|
||||||
|
{
|
||||||
|
CasterNetworkId = projOwnerId,
|
||||||
|
Speed = k_ReelSpeed,
|
||||||
|
ExpireTick = TickUtil.NonZero(nt.ServerTick.TickIndexForValidTick + k_ReelLeashTicks),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if (Tuning.KnockbackSpeed > 0f)
|
||||||
{
|
{
|
||||||
bool pull = hasFx && (fx.Flags & ProjectileEffectFlag.Pull) != 0;
|
bool pull = hasFx && (fx.Flags & ProjectileEffectFlag.Pull) != 0;
|
||||||
float2 kdir = pull ? -proj.ValueRO.Direction : proj.ValueRO.Direction;
|
float2 kdir = pull ? -proj.ValueRO.Direction : proj.ValueRO.Direction;
|
||||||
@@ -177,6 +201,7 @@ namespace ProjectM.Server
|
|||||||
UntilTick = TickUtil.NonZero(nt.ServerTick.TickIndexForValidTick + (uint)math.max(1, Tuning.KnockbackDurationTicks)),
|
UntilTick = TickUtil.NonZero(nt.ServerTick.TickIndexForValidTick + (uint)math.max(1, Tuning.KnockbackDurationTicks)),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Phase 1.7: pierce/chain let the projectile SURVIVE; else it is consumed. Record the target so it
|
// Phase 1.7: pierce/chain let the projectile SURVIVE; else it is consumed. Record the target so it
|
||||||
// can't be re-hit. A full hit-set is a natural cap → destroy.
|
// can't be re-hit. A full hit-set is a natural cap → destroy.
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
using ProjectM.Simulation;
|
||||||
|
using Unity.Burst;
|
||||||
|
using Unity.Collections;
|
||||||
|
using Unity.Entities;
|
||||||
|
using Unity.Mathematics;
|
||||||
|
using Unity.NetCode;
|
||||||
|
using Unity.Transforms;
|
||||||
|
|
||||||
|
namespace ProjectM.Server
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// SERVER-ONLY Harpooner reel driver. For every Husk carrying an active <see cref="ReelState"/> (stamped by
|
||||||
|
/// <see cref="ProjectileDamageSystem"/> on a Reel-flagged HookPull hit), it re-aims the Husk's
|
||||||
|
/// <see cref="KnockbackState"/> toward the CASTER's CURRENT position every tick — so the pull HOMES (unlike
|
||||||
|
/// the frozen-Dir pull flag). <see cref="EnemyAISystem"/> then DRIVES that re-aimed knockback, staying the
|
||||||
|
/// SOLE writer of the Husk's Position; this system writes only KnockbackState.Dir/Speed/UntilTick (never a
|
||||||
|
/// position). Runs in the plain <see cref="SimulationSystemGroup"/> AFTER the predicted group (so THIS tick's
|
||||||
|
/// stamp is visible) and BEFORE <see cref="EnemyAISystem"/>. Releases (clears both states) when the target is
|
||||||
|
/// within release range, the leash (<see cref="ReelState.ExpireTick"/>) elapses, or the caster is gone.
|
||||||
|
/// Bosses never reel (they don't carry KnockbackState/ReelState — knockback-immune, A4). Ticks via
|
||||||
|
/// <see cref="TickUtil.NonZero"/>; compared with <see cref="NetworkTick"/> only.
|
||||||
|
/// </summary>
|
||||||
|
[BurstCompile]
|
||||||
|
[WorldSystemFilter(WorldSystemFilterFlags.ServerSimulation)]
|
||||||
|
[UpdateInGroup(typeof(SimulationSystemGroup))]
|
||||||
|
[UpdateAfter(typeof(PredictedSimulationSystemGroup))]
|
||||||
|
[UpdateBefore(typeof(EnemyAISystem))]
|
||||||
|
public partial struct ReelSystem : ISystem
|
||||||
|
{
|
||||||
|
const float k_ReleaseDistance = 1.6f; // stop reeling once the target is this close to the caster (world units)
|
||||||
|
|
||||||
|
[BurstCompile]
|
||||||
|
public void OnCreate(ref SystemState state)
|
||||||
|
{
|
||||||
|
state.RequireForUpdate<NetworkTime>();
|
||||||
|
state.RequireForUpdate(state.GetEntityQuery(ComponentType.ReadOnly<ReelState>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
[BurstCompile]
|
||||||
|
public void OnUpdate(ref SystemState state)
|
||||||
|
{
|
||||||
|
var serverTick = SystemAPI.GetSingleton<NetworkTime>().ServerTick;
|
||||||
|
if (!serverTick.IsValid) return;
|
||||||
|
uint now = serverTick.TickIndexForValidTick;
|
||||||
|
|
||||||
|
// Snapshot living players by NetworkId (<=4 in co-op; linear lookup is cheaper than a hashmap).
|
||||||
|
var casterIds = new NativeList<int>(Allocator.Temp);
|
||||||
|
var casterPos = new NativeList<float3>(Allocator.Temp);
|
||||||
|
foreach (var (owner, lt, hp) in
|
||||||
|
SystemAPI.Query<RefRO<GhostOwner>, RefRO<LocalTransform>, RefRO<Health>>().WithAll<PlayerTag>())
|
||||||
|
{
|
||||||
|
if (hp.ValueRO.Current <= 0f) continue;
|
||||||
|
casterIds.Add(owner.ValueRO.NetworkId);
|
||||||
|
casterPos.Add(lt.ValueRO.Position);
|
||||||
|
}
|
||||||
|
|
||||||
|
float releaseSq = k_ReleaseDistance * k_ReleaseDistance;
|
||||||
|
|
||||||
|
foreach (var (reel, knockback, lt) in
|
||||||
|
SystemAPI.Query<RefRW<ReelState>, RefRW<KnockbackState>, RefRO<LocalTransform>>()
|
||||||
|
.WithAll<EnemyTag>().WithNone<Dying>())
|
||||||
|
{
|
||||||
|
uint expire = reel.ValueRO.ExpireTick;
|
||||||
|
bool active = expire != 0u && new NetworkTick(expire).IsNewerThan(serverTick);
|
||||||
|
if (!active)
|
||||||
|
{
|
||||||
|
// Leash elapsed (or never reeling): release so EnemyAISystem resumes seek next tick.
|
||||||
|
if (expire != 0u) { reel.ValueRW.ExpireTick = 0u; knockback.ValueRW.UntilTick = 0u; }
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx = -1;
|
||||||
|
for (int i = 0; i < casterIds.Length; i++)
|
||||||
|
if (casterIds[i] == reel.ValueRO.CasterNetworkId) { idx = i; break; }
|
||||||
|
if (idx < 0) { reel.ValueRW.ExpireTick = 0u; knockback.ValueRW.UntilTick = 0u; continue; } // caster gone
|
||||||
|
|
||||||
|
float3 pos = lt.ValueRO.Position;
|
||||||
|
float2 to = casterPos[idx].xz - pos.xz;
|
||||||
|
if (math.lengthsq(to) <= releaseSq)
|
||||||
|
{
|
||||||
|
// Arrived at the caster: release (don't jitter on top of the player).
|
||||||
|
reel.ValueRW.ExpireTick = 0u;
|
||||||
|
knockback.ValueRW.UntilTick = 0u;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Home: re-aim the knockback toward the caster's LIVE position for exactly this tick; EnemyAISystem
|
||||||
|
// applies it. Re-stamped every tick while reeling so it tracks the caster as they move.
|
||||||
|
float2 dir = math.normalize(to);
|
||||||
|
knockback.ValueRW.Dir = dir;
|
||||||
|
knockback.ValueRW.Speed = reel.ValueRO.Speed;
|
||||||
|
knockback.ValueRW.UntilTick = TickUtil.NonZero(now + 1u);
|
||||||
|
}
|
||||||
|
|
||||||
|
casterIds.Dispose();
|
||||||
|
casterPos.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 63b7300c466d5a945a7ce275769efea3
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
using ProjectM.Simulation;
|
||||||
|
using Unity.Burst;
|
||||||
|
using Unity.Collections;
|
||||||
|
using Unity.Entities;
|
||||||
|
using Unity.Mathematics;
|
||||||
|
using Unity.NetCode;
|
||||||
|
using Unity.Transforms;
|
||||||
|
|
||||||
|
namespace ProjectM.Server
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// SERVER-ONLY player-cast zone driver (Vortex / LightZone — the LANTERN Aoe/zone Sparks). Borrows the
|
||||||
|
/// <see cref="GeyserEruptSystem"/> skeleton — the INVERTED invalid-tick guard (a born-0 <see cref="ZoneEffect.NextTick"/>
|
||||||
|
/// is lazy-stamped born-correct, never storm-fires) and the <c>= now + period</c> reschedule — but is
|
||||||
|
/// ENEMY-ONLY (NO friendly fire), stamps <see cref="DamageEvent.SourceNetworkId"/> = the caster's NetworkId
|
||||||
|
/// (kills credit the caster — NOT the -1 environment convention), and has NO region gate (a no-world gym).
|
||||||
|
/// A <see cref="ZoneEffectFlag.Vortex"/> zone ALSO writes a gentle inward <see cref="KnockbackState"/> every
|
||||||
|
/// tick (EnemyAISystem drives it, sole Position writer), so runs BEFORE EnemyAISystem. DestroyEntity when
|
||||||
|
/// <see cref="ZoneEffect.ExpireTick"/> elapses (server-authoritative ghost despawn). Ticks via
|
||||||
|
/// <see cref="TickUtil.NonZero"/>; compared with <see cref="NetworkTick"/> only.
|
||||||
|
/// </summary>
|
||||||
|
[BurstCompile]
|
||||||
|
[WorldSystemFilter(WorldSystemFilterFlags.ServerSimulation)]
|
||||||
|
[UpdateInGroup(typeof(SimulationSystemGroup))]
|
||||||
|
[UpdateAfter(typeof(PredictedSimulationSystemGroup))]
|
||||||
|
[UpdateBefore(typeof(EnemyAISystem))]
|
||||||
|
public partial struct ZonePulseSystem : ISystem
|
||||||
|
{
|
||||||
|
const uint k_PulsePeriodTicks = 30u; // damage cadence (~0.5s at 60 ticks/sec)
|
||||||
|
const float k_VortexPullSpeed = 4f; // gentle inward drift for a Vortex (world units/sec)
|
||||||
|
const float k_VortexDeadzoneSq = 0.25f; // don't re-aim (or NaN) an enemy already at the zone centre
|
||||||
|
|
||||||
|
ComponentLookup<KnockbackState> m_KnockbackLookup;
|
||||||
|
ComponentLookup<BossState> m_BossLookup;
|
||||||
|
|
||||||
|
[BurstCompile]
|
||||||
|
public void OnCreate(ref SystemState state)
|
||||||
|
{
|
||||||
|
state.RequireForUpdate<NetworkTime>();
|
||||||
|
state.RequireForUpdate<ZoneEffect>();
|
||||||
|
m_KnockbackLookup = state.GetComponentLookup<KnockbackState>(isReadOnly: false);
|
||||||
|
m_BossLookup = state.GetComponentLookup<BossState>(isReadOnly: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
[BurstCompile]
|
||||||
|
public void OnUpdate(ref SystemState state)
|
||||||
|
{
|
||||||
|
var serverTick = SystemAPI.GetSingleton<NetworkTime>().ServerTick;
|
||||||
|
if (!serverTick.IsValid) return;
|
||||||
|
uint now = serverTick.TickIndexForValidTick;
|
||||||
|
uint stamp = TickUtil.NonZero(now);
|
||||||
|
uint reschedule = TickUtil.NonZero(now + k_PulsePeriodTicks);
|
||||||
|
m_KnockbackLookup.Update(ref state);
|
||||||
|
m_BossLookup.Update(ref state);
|
||||||
|
|
||||||
|
// Living enemies once this tick (entities + positions; stable query order).
|
||||||
|
var enemyEntities = new NativeList<Entity>(Allocator.Temp);
|
||||||
|
var enemyPositions = new NativeList<float3>(Allocator.Temp);
|
||||||
|
foreach (var (lt, hp, e) in
|
||||||
|
SystemAPI.Query<RefRO<LocalTransform>, RefRO<Health>>()
|
||||||
|
.WithAll<EnemyTag>().WithNone<Dying>().WithEntityAccess())
|
||||||
|
{
|
||||||
|
if (hp.ValueRO.Current <= 0f) continue;
|
||||||
|
enemyEntities.Add(e);
|
||||||
|
enemyPositions.Add(lt.ValueRO.Position);
|
||||||
|
}
|
||||||
|
|
||||||
|
var ecb = new EntityCommandBuffer(Allocator.Temp);
|
||||||
|
|
||||||
|
foreach (var (zone, lt, zoneEntity) in
|
||||||
|
SystemAPI.Query<RefRW<ZoneEffect>, RefRO<LocalTransform>>().WithEntityAccess())
|
||||||
|
{
|
||||||
|
var ze = zone.ValueRO;
|
||||||
|
|
||||||
|
// Lifetime: despawn the zone ghost when the leash elapses (server-authoritative).
|
||||||
|
if (ze.ExpireTick != 0u && !new NetworkTick(ze.ExpireTick).IsNewerThan(serverTick))
|
||||||
|
{
|
||||||
|
ecb.DestroyEntity(zoneEntity);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 center = lt.ValueRO.Position;
|
||||||
|
float radiusSq = ze.Radius * ze.Radius;
|
||||||
|
bool vortex = (ze.Flags & ZoneEffectFlag.Vortex) != 0;
|
||||||
|
|
||||||
|
// Vortex pull: gentle inward drift EVERY tick (re-stamped, one tick; EnemyAISystem applies it).
|
||||||
|
if (vortex)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < enemyEntities.Length; i++)
|
||||||
|
{
|
||||||
|
float2 to = center.xz - enemyPositions[i].xz;
|
||||||
|
float d2 = math.lengthsq(to);
|
||||||
|
if (d2 > radiusSq || d2 <= k_VortexDeadzoneSq) continue;
|
||||||
|
var e = enemyEntities[i];
|
||||||
|
if (!m_KnockbackLookup.HasComponent(e) || m_BossLookup.HasComponent(e)) continue;
|
||||||
|
m_KnockbackLookup[e] = new KnockbackState
|
||||||
|
{
|
||||||
|
Dir = math.normalize(to),
|
||||||
|
Speed = k_VortexPullSpeed,
|
||||||
|
UntilTick = TickUtil.NonZero(now + 1u),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Damage pulse: INVERTED invalid-tick guard (a born-0 NextTick lazy-stamps born-correct, never storms).
|
||||||
|
uint next = ze.NextTick;
|
||||||
|
if (next == 0u || !new NetworkTick(next).IsValid)
|
||||||
|
{
|
||||||
|
zone.ValueRW.NextTick = reschedule;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (new NetworkTick(next).IsNewerThan(serverTick)) continue; // still counting down
|
||||||
|
|
||||||
|
for (int i = 0; i < enemyEntities.Length; i++)
|
||||||
|
{
|
||||||
|
if (math.distancesq(enemyPositions[i].xz, center.xz) > radiusSq) continue;
|
||||||
|
ecb.AppendToBuffer(enemyEntities[i], new DamageEvent
|
||||||
|
{
|
||||||
|
Amount = ze.DamagePerPulse,
|
||||||
|
SourceNetworkId = ze.CasterNetworkId,
|
||||||
|
SourceTick = stamp,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
zone.ValueRW.NextTick = reschedule;
|
||||||
|
}
|
||||||
|
|
||||||
|
ecb.Playback(state.EntityManager);
|
||||||
|
ecb.Dispose();
|
||||||
|
enemyEntities.Dispose();
|
||||||
|
enemyPositions.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2f96f56094eb9d4498f9e2da9d819e2a
|
||||||
@@ -40,8 +40,14 @@ namespace ProjectM.Server
|
|||||||
// BEFORE the ECB exists — a per-request continue would already have marked the connection in-game.
|
// BEFORE the ECB exists — a per-request continue would already have marked the connection in-game.
|
||||||
// Nothing is consumed; RequireForUpdate re-passes and the request retries next tick (a ≤1-tick window
|
// Nothing is consumed; RequireForUpdate re-passes and the request retries next tick (a ≤1-tick window
|
||||||
// in practice — the director spawns at subscene-stream, before any GoInGame round-trip).
|
// in practice — the director spawns at subscene-stream, before any GoInGame round-trip).
|
||||||
if (!SystemAPI.TryGetSingleton<MetaUpgradeCatalog>(out var metaCatalog) || !metaCatalog.Value.IsCreated
|
// GYM (LANTERN A1): a fresh gym subscene has no CycleDirector, so the base meta-catalog guard would
|
||||||
|| !SystemAPI.TryGetSingletonBuffer<MetaTierState>(out var metaRecord, true))
|
// block spawns forever. GymTag switches to the clean gym path (no meta seeding; a default Spark socket
|
||||||
|
// loadout below instead). The class seeds still apply (harmless: AbilityFireSystem reads sockets).
|
||||||
|
bool isGym = SystemAPI.HasSingleton<GymTag>();
|
||||||
|
MetaUpgradeCatalog metaCatalog = default;
|
||||||
|
DynamicBuffer<MetaTierState> metaRecord = default;
|
||||||
|
if (!isGym && (!SystemAPI.TryGetSingleton<MetaUpgradeCatalog>(out metaCatalog) || !metaCatalog.Value.IsCreated
|
||||||
|
|| !SystemAPI.TryGetSingletonBuffer<MetaTierState>(out metaRecord, true)))
|
||||||
{
|
{
|
||||||
if (!_warnedMetaBlocked)
|
if (!_warnedMetaBlocked)
|
||||||
{
|
{
|
||||||
@@ -82,11 +88,22 @@ namespace ProjectM.Server
|
|||||||
// Expedition redesign: the server-only class anchor the meta systems key on (born-correct meta
|
// Expedition redesign: the server-only class anchor the meta systems key on (born-correct meta
|
||||||
// seeding at Step 12a + per-class spend at Step 13 resolve the tier record through this).
|
// seeding at Step 12a + per-class spend at Step 13 resolve the tier record through this).
|
||||||
ecb.AddComponent(player, new PlayerClass { ClassId = classId });
|
ecb.AddComponent(player, new PlayerClass { ClassId = classId });
|
||||||
|
if (isGym)
|
||||||
|
{
|
||||||
|
// GYM: default Spark socket loadout on keys 1-4 (AbilityFireSystem reads sockets, not AbilityRef).
|
||||||
|
// LightZone(9) is defined + dispatch-ready but off the default bar (socket it via a swap).
|
||||||
|
var gymSockets = ecb.SetBuffer<AbilitySocket>(player);
|
||||||
|
gymSockets.Add(new AbilitySocket { SparkId = (byte)AbilityId.HookPull });
|
||||||
|
gymSockets.Add(new AbilitySocket { SparkId = (byte)AbilityId.Blink });
|
||||||
|
gymSockets.Add(new AbilitySocket { SparkId = (byte)AbilityId.DecoyWisp });
|
||||||
|
gymSockets.Add(new AbilitySocket { SparkId = (byte)AbilityId.Vortex });
|
||||||
|
}
|
||||||
// Step 12a: born-correct PERMANENT meta seeding — replay this class's persisted tiers as
|
// Step 12a: born-correct PERMANENT meta seeding — replay this class's persisted tiers as
|
||||||
// meta-band StatModifiers on the just-instantiated player (same ECB as Instantiate, the
|
// meta-band StatModifiers on the just-instantiated player (same ECB as Instantiate, the
|
||||||
// ClassTraits idiom). Skip tier 0 / unknown ids (preserve-don't-crash); CLAMP a saved tier above a
|
// ClassTraits idiom). Skip tier 0 / unknown ids (preserve-don't-crash); CLAMP a saved tier above a
|
||||||
// rebalanced MaxTier (D-F5). Class gate via BoonMath.MaskFor (ClassId is the normalized
|
// rebalanced MaxTier (D-F5). Class gate via BoonMath.MaskFor (ClassId is the normalized
|
||||||
// CharacterId 2/3 — a raw 1<<ClassId would compute bits 2/3 and silently skip everything).
|
// CharacterId 2/3 — a raw 1<<ClassId would compute bits 2/3 and silently skip everything).
|
||||||
|
if (!isGym)
|
||||||
{
|
{
|
||||||
ref var metaPool = ref metaCatalog.Value.Value;
|
ref var metaPool = ref metaCatalog.Value.Value;
|
||||||
byte classBit = BoonMath.MaskFor(classId);
|
byte classBit = BoonMath.MaskFor(classId);
|
||||||
|
|||||||
@@ -208,6 +208,33 @@ namespace ProjectM.Server
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case DebugOp.SpawnEnemy:
|
||||||
|
// GYM: spawn a chosen enemy KIND (Drowner/Grindylow) from the baked roster near the sender.
|
||||||
|
if (sender != Entity.Null && SystemAPI.HasComponent<LocalTransform>(sender)
|
||||||
|
&& SystemAPI.TryGetSingletonEntity<GymTag>(out var gymEntity)
|
||||||
|
&& SystemAPI.HasBuffer<GymEnemyRoster>(gymEntity))
|
||||||
|
{
|
||||||
|
var roster = SystemAPI.GetBuffer<GymEnemyRoster>(gymEntity);
|
||||||
|
Entity enemyPrefab = Entity.Null;
|
||||||
|
for (int r = 0; r < roster.Length; r++)
|
||||||
|
if (roster[r].Kind == (byte)cmd.ArgA) { enemyPrefab = roster[r].Prefab; break; }
|
||||||
|
if (enemyPrefab != Entity.Null)
|
||||||
|
{
|
||||||
|
var sPos = SystemAPI.GetComponent<LocalTransform>(sender).Position;
|
||||||
|
var bakedEnemyLt = state.EntityManager.GetComponentData<LocalTransform>(enemyPrefab);
|
||||||
|
int spawnCount = math.max(1, cmd.ArgB);
|
||||||
|
for (int k = 0; k < spawnCount; k++)
|
||||||
|
{
|
||||||
|
float ang = k * 0.7f;
|
||||||
|
float3 pos = sPos + new float3(math.cos(ang), 0f, math.sin(ang)) * 5f;
|
||||||
|
pos.y = sPos.y;
|
||||||
|
var enemy = ecb.Instantiate(enemyPrefab);
|
||||||
|
ecb.SetComponent(enemy, bakedEnemyLt.WithPosition(pos));
|
||||||
|
ecb.AddComponent(enemy, new RegionTag { Region = RegionId.Base });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ecb.DestroyEntity(reqEntity);
|
ecb.DestroyEntity(reqEntity);
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ namespace ProjectM.Simulation
|
|||||||
public float AutoTargetRange;
|
public float AutoTargetRange;
|
||||||
public float AutoTargetConeRadians;
|
public float AutoTargetConeRadians;
|
||||||
public int CooldownTicks;
|
public int CooldownTicks;
|
||||||
|
public byte EffectFlags; // ProjectileEffectFlag bits stamped at spawn (the Reel bit ⇒ HookPull homes the hit target to the caster). Config, not replicated.
|
||||||
|
public int DurationTicks; // Aoe/zone + decoy lifetime, ticks (0 = system default). Reel leash is a system const.
|
||||||
public FixedString64Bytes Name;
|
public FixedString64Bytes Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ namespace ProjectM.Simulation
|
|||||||
///
|
///
|
||||||
/// Determinism/idempotency: gated behind IsFirstTimeFullyPredictingTick so a rollback re-sim never
|
/// Determinism/idempotency: gated behind IsFirstTimeFullyPredictingTick so a rollback re-sim never
|
||||||
/// double-spawns. No wall-clock, no System.Random. Predict-spawn is reserved for the Projectile archetype;
|
/// double-spawns. No wall-clock, no System.Random. Predict-spawn is reserved for the Projectile archetype;
|
||||||
/// Cone applies its effect server-only (cooldown predicted both worlds). Aoe/Hitscan/movement archetypes
|
/// Cone/Aoe/Hitscan apply their effect SERVER-ONLY (cooldown predicted on both worlds); the Aoe archetype
|
||||||
/// are handled elsewhere (steps 3/4) and fall through here. Auto-target stays server-only + gamepad-only.
|
/// instantiates its interpolated ghost server-only. Movement (Blink) falls through to BlinkSystem. Auto-target stays server-only + gamepad-only.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[UpdateInGroup(typeof(PredictedSimulationSystemGroup))]
|
[UpdateInGroup(typeof(PredictedSimulationSystemGroup))]
|
||||||
[UpdateAfter(typeof(PlayerAimSystem))]
|
[UpdateAfter(typeof(PlayerAimSystem))]
|
||||||
@@ -46,9 +46,16 @@ namespace ProjectM.Simulation
|
|||||||
BufferLookup<AbilitySocket> m_SocketLookup;
|
BufferLookup<AbilitySocket> m_SocketLookup;
|
||||||
ComponentLookup<SocketCooldown> m_SocketCdLookup;
|
ComponentLookup<SocketCooldown> m_SocketCdLookup;
|
||||||
BufferLookup<EffectiveSocketStats> m_EffSocketLookup;
|
BufferLookup<EffectiveSocketStats> m_EffSocketLookup;
|
||||||
|
// Prefab-membership + baked transform of an Aoe spawn prefab, read on the PREFAB entity to pick
|
||||||
|
// ZoneEffect vs DecoyTag and preserve baked scale. RO; the actual Instantiate is server-only.
|
||||||
|
ComponentLookup<ZoneEffect> m_ZoneLookup;
|
||||||
|
ComponentLookup<DecoyTag> m_DecoyLookup;
|
||||||
|
ComponentLookup<LocalTransform> m_LtLookup;
|
||||||
|
|
||||||
/// <summary>~9 degree gap between adjacent Split-Shot projectiles (tunable).</summary>
|
/// <summary>~9 degree gap between adjacent Split-Shot projectiles (tunable).</summary>
|
||||||
const float k_ForkSpreadRad = 0.157f;
|
const float k_ForkSpreadRad = 0.157f;
|
||||||
|
const float k_AoeCastAhead = 2.5f; // world units ahead of the caster to drop an Aoe/zone/decoy ghost
|
||||||
|
const float k_HitscanHalfWidth = 0.6f; // hitscan beam half-width (world units)
|
||||||
|
|
||||||
[BurstCompile]
|
[BurstCompile]
|
||||||
public void OnCreate(ref SystemState state)
|
public void OnCreate(ref SystemState state)
|
||||||
@@ -61,6 +68,9 @@ namespace ProjectM.Simulation
|
|||||||
m_SocketLookup = state.GetBufferLookup<AbilitySocket>(isReadOnly: true);
|
m_SocketLookup = state.GetBufferLookup<AbilitySocket>(isReadOnly: true);
|
||||||
m_SocketCdLookup = state.GetComponentLookup<SocketCooldown>(isReadOnly: false);
|
m_SocketCdLookup = state.GetComponentLookup<SocketCooldown>(isReadOnly: false);
|
||||||
m_EffSocketLookup = state.GetBufferLookup<EffectiveSocketStats>(isReadOnly: true);
|
m_EffSocketLookup = state.GetBufferLookup<EffectiveSocketStats>(isReadOnly: true);
|
||||||
|
m_ZoneLookup = state.GetComponentLookup<ZoneEffect>(isReadOnly: true);
|
||||||
|
m_DecoyLookup = state.GetComponentLookup<DecoyTag>(isReadOnly: true);
|
||||||
|
m_LtLookup = state.GetComponentLookup<LocalTransform>(isReadOnly: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
[BurstCompile]
|
[BurstCompile]
|
||||||
@@ -85,6 +95,9 @@ namespace ProjectM.Simulation
|
|||||||
m_SocketLookup.Update(ref state);
|
m_SocketLookup.Update(ref state);
|
||||||
m_SocketCdLookup.Update(ref state);
|
m_SocketCdLookup.Update(ref state);
|
||||||
m_EffSocketLookup.Update(ref state);
|
m_EffSocketLookup.Update(ref state);
|
||||||
|
m_ZoneLookup.Update(ref state);
|
||||||
|
m_DecoyLookup.Update(ref state);
|
||||||
|
m_LtLookup.Update(ref state);
|
||||||
|
|
||||||
// Server-only LIVING-enemy target set (auto-target assist + Cone cleave), collected once.
|
// Server-only LIVING-enemy target set (auto-target assist + Cone cleave), collected once.
|
||||||
var candidatePositions = new NativeList<float3>(Allocator.Temp);
|
var candidatePositions = new NativeList<float3>(Allocator.Temp);
|
||||||
@@ -170,7 +183,74 @@ namespace ProjectM.Simulation
|
|||||||
cdDirty = true;
|
cdDirty = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Aoe/Hitscan (steps 3) and movement/Blink (step 4) are not dispatched here yet.
|
// AOE / ZONE / DECOY (decoy-wisp, vortex, light-zone): predict the cooldown on BOTH worlds;
|
||||||
|
// instantiate the interpolated ownerless ghost SERVER-ONLY -- the client must NEVER instantiate it (Build Spec §5).
|
||||||
|
if (archetype == (byte)AbilityArchetype.Aoe)
|
||||||
|
{
|
||||||
|
if (isServer)
|
||||||
|
{
|
||||||
|
Entity aoePrefab = Entity.Null;
|
||||||
|
for (int i = 0; i < abilityPrefabs.Length; i++)
|
||||||
|
if (abilityPrefabs[i].Id == sparkId) { aoePrefab = abilityPrefabs[i].Prefab; break; }
|
||||||
|
if (aoePrefab != Entity.Null)
|
||||||
|
{
|
||||||
|
float2 aFace = facing.ValueRO.Direction;
|
||||||
|
aFace = math.lengthsq(aFace) < 1e-6f ? new float2(0f, 1f) : math.normalize(aFace);
|
||||||
|
float3 spawnPos = xform.ValueRO.Position + new float3(aFace.x, 0f, aFace.y) * k_AoeCastAhead;
|
||||||
|
spawnPos.y = xform.ValueRO.Position.y;
|
||||||
|
uint expire = adef.DurationTicks > 0
|
||||||
|
? TickUtil.NonZero(serverTick.TickIndexForValidTick + (uint)adef.DurationTicks) : 0u;
|
||||||
|
var bakedLt = m_LtLookup.HasComponent(aoePrefab) ? m_LtLookup[aoePrefab] : LocalTransform.Identity;
|
||||||
|
var effect = ecb.Instantiate(aoePrefab);
|
||||||
|
ecb.SetComponent(effect, bakedLt.WithPosition(spawnPos));
|
||||||
|
if (m_ZoneLookup.HasComponent(aoePrefab))
|
||||||
|
ecb.SetComponent(effect, new ZoneEffect
|
||||||
|
{
|
||||||
|
CasterNetworkId = owner.ValueRO.NetworkId,
|
||||||
|
Radius = math.max(0.1f, es.Range),
|
||||||
|
DamagePerPulse = es.Damage,
|
||||||
|
NextTick = 0u, // lazy-stamped born-correct by ZonePulseSystem (never storm-fires)
|
||||||
|
ExpireTick = expire,
|
||||||
|
Flags = m_ZoneLookup[aoePrefab].Flags, // Vortex bit baked on the prefab
|
||||||
|
});
|
||||||
|
else if (m_DecoyLookup.HasComponent(aoePrefab))
|
||||||
|
ecb.SetComponent(effect, new DecoyTag { ExpireTick = expire });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cd.Set(sk, TickUtil.NonZero(serverTick.TickIndexForValidTick + (uint)math.max(1, es.CooldownTicks)));
|
||||||
|
cdDirty = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// HITSCAN: no ghost on either world; predict the cooldown both worlds; server-only swept-beam damage.
|
||||||
|
// (No Phase-1 Spark uses Hitscan yet; the branch completes the archetype dispatch per Build Spec §5.)
|
||||||
|
if (archetype == (byte)AbilityArchetype.Hitscan)
|
||||||
|
{
|
||||||
|
if (isServer)
|
||||||
|
{
|
||||||
|
float2 hFace = facing.ValueRO.Direction;
|
||||||
|
hFace = math.lengthsq(hFace) < 1e-6f ? new float2(0f, 1f) : math.normalize(hFace);
|
||||||
|
float hRange = math.max(0.1f, es.Range);
|
||||||
|
uint hStamp = TickUtil.NonZero(serverTick.TickIndexForValidTick);
|
||||||
|
for (int hi = 0; hi < coneTargets.Length; hi++)
|
||||||
|
{
|
||||||
|
float2 rel = coneTargetPos[hi].xz - xform.ValueRO.Position.xz;
|
||||||
|
float t = math.dot(rel, hFace);
|
||||||
|
if (t < 0f || t > hRange) continue;
|
||||||
|
float2 perp = rel - hFace * t;
|
||||||
|
if (math.lengthsq(perp) > k_HitscanHalfWidth * k_HitscanHalfWidth) continue;
|
||||||
|
ecb.AppendToBuffer(coneTargets[hi], new DamageEvent
|
||||||
|
{
|
||||||
|
Amount = es.Damage,
|
||||||
|
SourceNetworkId = owner.ValueRO.NetworkId,
|
||||||
|
SourceTick = hStamp,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cd.Set(sk, TickUtil.NonZero(serverTick.TickIndexForValidTick + (uint)math.max(1, es.CooldownTicks)));
|
||||||
|
cdDirty = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// MOVEMENT (Blink) + any other non-Projectile: fall through (BlinkSystem owns the movement socket's cooldown row).
|
||||||
if (archetype != (byte)AbilityArchetype.Projectile)
|
if (archetype != (byte)AbilityArchetype.Projectile)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -197,7 +277,7 @@ namespace ProjectM.Simulation
|
|||||||
|
|
||||||
byte pierce = bfx.Pierce;
|
byte pierce = bfx.Pierce;
|
||||||
byte chain = bfx.Chain;
|
byte chain = bfx.Chain;
|
||||||
byte projFlags = pull ? ProjectileEffectFlag.Pull : (byte)0;
|
byte projFlags = (byte)((pull ? ProjectileEffectFlag.Pull : 0) | adef.EffectFlags);
|
||||||
int shots = 1 + math.min((int)bfx.Fork, 8);
|
int shots = 1 + math.min((int)bfx.Fork, 8);
|
||||||
|
|
||||||
for (int s = 0; s < shots; s++)
|
for (int s = 0; s < shots; s++)
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ namespace ProjectM.Simulation
|
|||||||
/// <summary>Bit masks for <see cref="ProjectileEffectState.Flags"/>.</summary>
|
/// <summary>Bit masks for <see cref="ProjectileEffectState.Flags"/>.</summary>
|
||||||
public static class ProjectileEffectFlag
|
public static class ProjectileEffectFlag
|
||||||
{
|
{
|
||||||
|
/// <summary>bit1 = Reel (HookPull): stamp the homing <see cref="ReelState"/> toward the CASTER instead of a frozen knockback.</summary>
|
||||||
|
public const byte Reel = 2;
|
||||||
public const byte Pull = 1;
|
public const byte Pull = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
using Unity.Entities;
|
||||||
|
|
||||||
|
namespace ProjectM.Simulation
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// SERVER-ONLY homing reel on a Husk hit by a Reel-flagged (HookPull) projectile — the Harpooner's signature
|
||||||
|
/// verb. A sibling of <see cref="KnockbackState"/>/<see cref="LungeState"/> (NOT a <c>[GhostField]</c>: the
|
||||||
|
/// reeled position replicates via the stock LocalTransform variant, so it adds no replicated surface). Unlike
|
||||||
|
/// the frozen-Dir pull flag, this HOMES: <c>ReelSystem</c> re-aims the Husk's <see cref="KnockbackState"/>
|
||||||
|
/// toward the caster's CURRENT position every server tick until the target is within release range or
|
||||||
|
/// <see cref="ExpireTick"/> elapses — <c>EnemyAISystem</c> stays the SOLE Position writer (it drives the
|
||||||
|
/// re-aimed knockback; ReelSystem only writes the Dir/Speed/UntilTick). Baked inert on Husk variants
|
||||||
|
/// (EnemyAuthoring). Stores the caster's <see cref="Unity.NetCode.NetworkId"/> (not an Entity) so ReelSystem
|
||||||
|
/// resolves the live caster position via a per-tick player-by-NetworkId gather. Ticks via
|
||||||
|
/// <see cref="TickUtil.NonZero"/>; compared with <see cref="Unity.NetCode.NetworkTick"/> only.
|
||||||
|
/// </summary>
|
||||||
|
public struct ReelState : IComponentData
|
||||||
|
{
|
||||||
|
/// <summary>NetworkId of the reeling caster; ReelSystem homes toward this player's live position.</summary>
|
||||||
|
public int CasterNetworkId;
|
||||||
|
|
||||||
|
/// <summary>Reel pull speed (world units/sec) written into KnockbackState.Speed each tick.</summary>
|
||||||
|
public float Speed;
|
||||||
|
|
||||||
|
/// <summary>Raw tick the reel leash ends (NonZero). <c>0</c> = not reeling; active while .IsNewerThan(serverTick).</summary>
|
||||||
|
public uint ExpireTick;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f6d64d0ff96ddd44a95c296e89442e6f
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
using Unity.Entities;
|
||||||
|
|
||||||
|
namespace ProjectM.Simulation
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// SERVER-ONLY periodic-AoE state on a player-cast zone ghost (Vortex / LightZone) — the LANTERN Aoe/zone
|
||||||
|
/// archetype. NOT a <c>[GhostField]</c>: the zone is a server-spawned INTERPOLATED ownerless ghost whose
|
||||||
|
/// position replicates via the stock LocalTransform variant; only its damage schedule lives here, server-side.
|
||||||
|
/// <c>ZonePulseSystem</c> borrows the <c>GeyserEruptSystem</c> skeleton (the INVERTED invalid-tick guard so a
|
||||||
|
/// born-0 tick never storm-fires + the <c>= now + period</c> reschedule) but is ENEMY-ONLY (no friendly fire),
|
||||||
|
/// stamps <see cref="DamageEvent.SourceNetworkId"/> = <see cref="CasterNetworkId"/> (kills credit the caster,
|
||||||
|
/// feeding KillRewardSystem — NOT the -1 environment convention), and has NO region gate (a no-world gym).
|
||||||
|
/// DestroyEntity when <see cref="ExpireTick"/> elapses.
|
||||||
|
/// </summary>
|
||||||
|
public struct ZoneEffect : IComponentData
|
||||||
|
{
|
||||||
|
/// <summary>NetworkId of the casting player (damage/kill attribution).</summary>
|
||||||
|
public int CasterNetworkId;
|
||||||
|
|
||||||
|
/// <summary>Planar (XZ) damage radius, world units.</summary>
|
||||||
|
public float Radius;
|
||||||
|
|
||||||
|
/// <summary>Damage dealt to each living enemy in radius per pulse.</summary>
|
||||||
|
public float DamagePerPulse;
|
||||||
|
|
||||||
|
/// <summary>Raw next-pulse tick (NonZero). <c>0</c> = unscheduled → lazy-stamped born-correct (GeyserErupt H2 rule, never storm-fires).</summary>
|
||||||
|
public uint NextTick;
|
||||||
|
|
||||||
|
/// <summary>Raw tick the zone despawns (NonZero). Active while .IsNewerThan(serverTick).</summary>
|
||||||
|
public uint ExpireTick;
|
||||||
|
|
||||||
|
/// <summary>See <see cref="ZoneEffectFlag"/>. bit0 = Vortex (also pull enemies toward the zone center each pulse).</summary>
|
||||||
|
public byte Flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Bit masks for <see cref="ZoneEffect.Flags"/>.</summary>
|
||||||
|
public static class ZoneEffectFlag
|
||||||
|
{
|
||||||
|
public const byte Vortex = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SERVER-ONLY decoy-wisp state (the Aoe/spawn Spark) — a server-spawned INTERPOLATED ownerless ghost that
|
||||||
|
/// draws Husk aggro. <c>EnemyAISystem</c> gathers DecoyTag entities into its target set so Husks path to and
|
||||||
|
/// strike the decoy (soaking hits via its Health/DamageEvent buffer); it despawns on <c>Health <= 0</c> or
|
||||||
|
/// when <see cref="ExpireTick"/> elapses (both handled where EnemyAISystem already iterates decoys). Position
|
||||||
|
/// replicates via the stock LocalTransform variant — NOT a <c>[GhostField]</c>.
|
||||||
|
/// </summary>
|
||||||
|
public struct DecoyTag : IComponentData
|
||||||
|
{
|
||||||
|
/// <summary>Raw tick the decoy despawns (NonZero). <c>0</c> = no timeout; active while .IsNewerThan(serverTick).</summary>
|
||||||
|
public uint ExpireTick;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 28a356c03de9cfc4c839924c5cb14f5c
|
||||||
@@ -68,5 +68,8 @@ namespace ProjectM.Simulation
|
|||||||
/// Strips the old class trait seeds, re-seeds the new ones, swaps the Fire ability, and heals a living
|
/// Strips the old class trait seeds, re-seeds the new ones, swaps the Fire ability, and heals a living
|
||||||
/// player to the new class's max. Editor-only dev tool (class-switch); 0 / unknown -> Warrior.</summary>
|
/// player to the new class's max. Editor-only dev tool (class-switch); 0 / unknown -> Warrior.</summary>
|
||||||
public const byte SetClass = 13;
|
public const byte SetClass = 13;
|
||||||
|
|
||||||
|
/// <summary>GYM (editor): spawn <see cref="GymEnemyKind"/> ArgA near the sender, ArgB times (default 1). Reads the baked GymEnemyRoster.</summary>
|
||||||
|
public const byte SpawnEnemy = 14;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using Unity.Entities;
|
||||||
|
|
||||||
|
namespace ProjectM.Simulation
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Singleton tag baked into the Enemy-test GYM subscene (see the LANTERN roadmap A1 gym note). Marks the world
|
||||||
|
/// as the gym so <c>GoInGameServerSystem</c> takes the CLEAN gym spawn path — bypassing the base/meta/cycle
|
||||||
|
/// seeding (the gym has no CycleDirector, so the meta-catalog spawn guard must not block it) and seeding a
|
||||||
|
/// default Spark socket loadout instead. Purely a mode switch; the gym never runs the base siege/economy.
|
||||||
|
/// </summary>
|
||||||
|
public struct GymTag : IComponentData { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Baked gym enemy roster — one row per on-demand-spawnable enemy KIND (buffer index is arbitrary; match on
|
||||||
|
/// <see cref="Kind"/>). <c>DebugCommandReceiveSystem</c>'s SpawnEnemy op instantiates the row whose Kind ==
|
||||||
|
/// ArgA near the requesting player. Entity refs can't live in a blob, so this is a companion buffer on the
|
||||||
|
/// gym-roster entity (the <see cref="AbilityPrefabElement"/> idiom). Server-read only.
|
||||||
|
/// </summary>
|
||||||
|
[InternalBufferCapacity(4)]
|
||||||
|
public struct GymEnemyRoster : IBufferElementData
|
||||||
|
{
|
||||||
|
/// <summary>Stable enemy-kind key (0 = Drowner, 1 = Grindylow; extend as the roster grows).</summary>
|
||||||
|
public byte Kind;
|
||||||
|
|
||||||
|
/// <summary>The baked enemy ghost prefab entity to instantiate for this kind.</summary>
|
||||||
|
public Entity Prefab;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Stable kind ids for <see cref="GymEnemyRoster.Kind"/> / the SpawnEnemy op's ArgA.</summary>
|
||||||
|
public static class GymEnemyKind
|
||||||
|
{
|
||||||
|
public const byte Drowner = 0;
|
||||||
|
public const byte Grindylow = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f39498494d08f66458393a87b395cd62
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user