├── Assets ├── UniAquarium │ ├── Editor.meta │ ├── package.json.meta │ ├── Editor │ │ ├── Core │ │ │ ├── Paints │ │ │ │ ├── Actors │ │ │ │ │ ├── IDestroyable.cs │ │ │ │ │ ├── IPressable.cs │ │ │ │ │ ├── IActor.cs │ │ │ │ │ ├── IInstantiable.cs │ │ │ │ │ ├── Actor.cs.meta │ │ │ │ │ ├── IActor.cs.meta │ │ │ │ │ ├── IPressable.cs.meta │ │ │ │ │ ├── ITransform.cs.meta │ │ │ │ │ ├── IDestroyable.cs.meta │ │ │ │ │ ├── IInstantiable.cs.meta │ │ │ │ │ ├── ITransform.cs │ │ │ │ │ └── Actor.cs │ │ │ │ ├── Actors.meta │ │ │ │ ├── Nodes.meta │ │ │ │ ├── Scene.meta │ │ │ │ ├── Nodes │ │ │ │ │ ├── Shape.cs │ │ │ │ │ ├── INode.cs │ │ │ │ │ ├── INode.cs.meta │ │ │ │ │ ├── Node.cs.meta │ │ │ │ │ ├── Shape.cs.meta │ │ │ │ │ ├── ReceiverNode.cs.meta │ │ │ │ │ ├── RenderNode.cs.meta │ │ │ │ │ ├── SpawnerNode.cs.meta │ │ │ │ │ ├── ReceiverNode.cs │ │ │ │ │ ├── RenderNode.cs │ │ │ │ │ ├── SpawnerNode.cs │ │ │ │ │ └── Node.cs │ │ │ │ ├── IPaintable.cs │ │ │ │ ├── Scene │ │ │ │ │ ├── ISceneOption.cs │ │ │ │ │ ├── CanvasScene.cs.meta │ │ │ │ │ ├── ISceneOption.cs.meta │ │ │ │ │ ├── ISceneUtility.cs.meta │ │ │ │ │ ├── ISceneUtility.cs │ │ │ │ │ └── CanvasScene.cs │ │ │ │ └── IPaintable.cs.meta │ │ │ ├── Paints.meta │ │ │ ├── Components.meta │ │ │ └── Components │ │ │ │ ├── CanvasSceneComponent.cs.meta │ │ │ │ └── CanvasSceneComponent.cs │ │ ├── Aquarium.meta │ │ ├── Core.meta │ │ ├── Foundation.meta │ │ ├── Aquarium │ │ │ ├── Actors.meta │ │ │ ├── Nodes.meta │ │ │ ├── Scene.meta │ │ │ ├── Actors │ │ │ │ ├── Spawner.meta │ │ │ │ ├── Boid.cs.meta │ │ │ │ ├── Fish.cs.meta │ │ │ │ ├── Food.cs.meta │ │ │ │ ├── JellyFish.cs.meta │ │ │ │ ├── Shockwave.cs.meta │ │ │ │ ├── AquariumActor.cs.meta │ │ │ │ ├── FishFactory.cs.meta │ │ │ │ ├── Lophophorata.cs.meta │ │ │ │ ├── Spawner │ │ │ │ │ ├── FoodSpawner.cs.meta │ │ │ │ │ ├── ShockwaveSpawner.cs.meta │ │ │ │ │ ├── ShockwaveSpawner.cs │ │ │ │ │ └── FoodSpawner.cs │ │ │ │ ├── AquariumActor.cs │ │ │ │ ├── FishFactory.cs │ │ │ │ ├── Lophophorata.cs │ │ │ │ ├── JellyFish.cs │ │ │ │ ├── Food.cs │ │ │ │ ├── Boid.cs │ │ │ │ ├── Fish.cs │ │ │ │ └── Shockwave.cs │ │ │ ├── Nodes │ │ │ │ ├── Mover.meta │ │ │ │ ├── Receiver.meta │ │ │ │ ├── Render.meta │ │ │ │ ├── Spawner.meta │ │ │ │ ├── Render │ │ │ │ │ ├── Shapes.meta │ │ │ │ │ └── Shapes │ │ │ │ │ │ ├── BranchShape.cs.meta │ │ │ │ │ │ ├── FishShape.cs.meta │ │ │ │ │ │ ├── FoodShape.cs.meta │ │ │ │ │ │ ├── CompositeShape.cs.meta │ │ │ │ │ │ ├── JellyFishShape.cs.meta │ │ │ │ │ │ ├── MarbleCircle.cs.meta │ │ │ │ │ │ ├── LophophorataShape.cs.meta │ │ │ │ │ │ ├── FoodShape.cs │ │ │ │ │ │ ├── LophophorataShape.cs │ │ │ │ │ │ ├── MarbleCircle.cs │ │ │ │ │ │ ├── CompositeShape.cs │ │ │ │ │ │ ├── BranchShape.cs │ │ │ │ │ │ ├── FishShape.cs │ │ │ │ │ │ └── JellyFishShape.cs │ │ │ │ ├── Mover │ │ │ │ │ ├── BoidNode.cs.meta │ │ │ │ │ ├── SwayFallingNode.cs.meta │ │ │ │ │ ├── TargetTrackingNode.cs.meta │ │ │ │ │ ├── SwayFallingNode.cs │ │ │ │ │ ├── BoidNode.cs │ │ │ │ │ └── TargetTrackingNode.cs │ │ │ │ ├── Receiver │ │ │ │ │ ├── FoodReceiverNode.cs.meta │ │ │ │ │ ├── ShockwaveReceiverNode.cs.meta │ │ │ │ │ ├── ShockwaveReceiverNode.cs │ │ │ │ │ └── FoodReceiverNode.cs │ │ │ │ └── Spawner │ │ │ │ │ ├── FoodSpawnerNode.cs.meta │ │ │ │ │ ├── ShockwaveSpawnerNode.cs.meta │ │ │ │ │ ├── ShockwaveSpawnerNode.cs │ │ │ │ │ └── FoodSpawnerNode.cs │ │ │ ├── Scene │ │ │ │ ├── AquariumScene.cs │ │ │ │ ├── AquariumScene.cs.meta │ │ │ │ ├── AquariumSceneOption.cs.meta │ │ │ │ └── AquariumSceneOption.cs │ │ │ ├── AquariumWindow.cs.meta │ │ │ ├── AquariumComponent.cs.meta │ │ │ ├── UniAquariumSettings.cs.meta │ │ │ ├── AquariumWindow.cs │ │ │ ├── AquariumComponent.cs │ │ │ └── UniAquariumSettings.cs │ │ ├── Foundation │ │ │ ├── Times.meta │ │ │ ├── Painter2D.meta │ │ │ ├── Painter2D │ │ │ │ ├── Painter2DScope.cs.meta │ │ │ │ ├── Painter2DExtension.cs.meta │ │ │ │ ├── Painter2DExtension.cs │ │ │ │ └── Painter2DScope.cs │ │ │ └── Times │ │ │ │ ├── EditorDeltaTime.cs.meta │ │ │ │ ├── EditorDeltaTimeInitializer.cs.meta │ │ │ │ ├── EditorDeltaTimeInitializer.cs │ │ │ │ └── EditorDeltaTime.cs │ │ ├── UniAquarium.Editor.asmdef.meta │ │ └── UniAquarium.Editor.asmdef │ └── package.json └── UniAquarium.meta ├── ProjectSettings ├── ProjectVersion.txt ├── ClusterInputManager.asset ├── PresetManager.asset ├── NetworkManager.asset ├── XRSettings.asset ├── VersionControlSettings.asset ├── TimeManager.asset ├── EditorBuildSettings.asset ├── VFXManager.asset ├── AudioManager.asset ├── TagManager.asset ├── UnityConnectSettings.asset ├── PackageManagerSettings.asset ├── MemorySettings.asset ├── EditorSettings.asset ├── DynamicsManager.asset ├── NavMeshAreas.asset ├── Physics2DSettings.asset ├── GraphicsSettings.asset ├── QualitySettings.asset ├── InputManager.asset └── ProjectSettings.asset ├── LICENSE.md ├── .gitignore ├── Packages ├── manifest.json └── packages-lock.json ├── Third Party Notices.md └── README.md /Assets/UniAquarium/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 495990c16a235144aad86e0e440a9738 -------------------------------------------------------------------------------- /Assets/UniAquarium/package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4c182c2b5e204c869b259eb9da3f65b3 3 | timeCreated: 1706905042 -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2022.3.10f1 2 | m_EditorVersionWithRevision: 2022.3.10f1 (ff3792e53c62) 3 | -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4cec97071343afa419054d3c304fdff7 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/IDestroyable.cs: -------------------------------------------------------------------------------- 1 | namespace UniAquarium.Core.Paints 2 | { 3 | public interface IDestroyable 4 | { 5 | bool IsDestroyed { get; } 6 | void Destroy(); 7 | } 8 | } -------------------------------------------------------------------------------- /ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5145f4a156014905aba701a9ae8b93e6 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 78502fa2fa9d4383bb1d868c29e79701 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fc142bee8e2c479499fbb8d7995a3396 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/IPressable.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine.UIElements; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | internal interface IPressable 6 | { 7 | void Press(MouseDownEvent evt); 8 | } 9 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f6f96db43a47412ba5ab6ebc7cb3632a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1e0998e2a1204fbeb15d8b1936578107 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 24d2b2ba7efb4ed5ba9d0652b7c7ac84 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Scene.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dfaf267999ac43669bc2a6d4ded79b6e 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Components.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d5e483f4d93f44a696bfd94834e40691 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 48e8d88c7cd3421584de4a680e37a143 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3c55354a95b4438696eb0c02e620b6ff 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Scene.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 75c386ef0a404c7dbba554b8317ef431 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Times.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9c422223ba364e0ea6fa57572ab82943 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/UniAquarium.Editor.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eefdeba31b4568046b66285523acb431 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Spawner.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f9def1eb71e4407aa626491e411ebaad 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Mover.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 122c6a5dc7144dd39cf2a17d0e358fdf 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Receiver.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 162ba25b091d4e2384ff94ff3e1e23b2 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: daea41e2d5f64f99bbeaed44faa0d5b7 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Spawner.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c2b540ee70914aa5958cac5cb28f24cf 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Painter2D.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0c1edacff0b14a859e4307689c716c93 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 92fd0a49fb984011b73898a0c7d37660 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Scene/AquariumScene.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Aquarium.Actors; 2 | using UniAquarium.Core.Paints; 3 | 4 | namespace UniAquarium.Aquarium.Scene 5 | { 6 | public class AquariumScene : CanvasScene 7 | { 8 | } 9 | } -------------------------------------------------------------------------------- /ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Visible Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/IActor.cs: -------------------------------------------------------------------------------- 1 | namespace UniAquarium.Core.Paints 2 | { 3 | public interface IActor : IPaintable, ITransform, IInstantiable, IDestroyable 4 | { 5 | void Initialize(); 6 | T GetNode() where T : INode; 7 | } 8 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/Shape.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine.UIElements; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | internal abstract class Shape 6 | { 7 | public abstract void Draw(Painter2D painter, ITransform transform, float deltaTime); 8 | } 9 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/IInstantiable.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | public interface IInstantiable where T : IPaintable 6 | { 7 | void Instantiate(Vector2? location, float angle = 0, float scale = 1); 8 | } 9 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/IPaintable.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine.UIElements; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | public interface IPaintable 6 | { 7 | void Draw(Painter2D painter, float deltaTime); 8 | void Update(float deltaTime); 9 | } 10 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/INode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | public interface INode : IPaintable 6 | { 7 | Guid Id { get; } 8 | void Initialize(ITransform transform, ISceneOption sceneOption); 9 | } 10 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Scene/ISceneOption.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Aquarium.Actors; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | public interface ISceneOption 6 | { 7 | float Width { get; } 8 | float Height { get; } 9 | ISceneUtility Utility { get; } 10 | } 11 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Boid.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 96694c7d61154f46be025330ccedb5f1 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Fish.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f9387fce61f248af82f68fd928811c0d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Food.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8cea968353254908aecd2c8eebf75e5e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/JellyFish.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c9fc9bc45d9a47b194687c9048e0e39f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Shockwave.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dbec1f45a98141bcbace38c15c849783 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/AquariumWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6a42407525a04fe995ae868f886b1545 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/Actor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2a8eb434142140d28c5727833ac2ab7e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/IActor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7e1083eea4f143be8eb036da9f80a200 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/IPaintable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4832f7707c4346eb998391d60ce04813 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/INode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7b84f715548a460f954a78eac0bbbb31 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/Node.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bf5c21d203204f3cba7012169ddfd714 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/Shape.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 40c7276592cf44e4a6d5d80c0f207796 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: 8 | - enabled: 1 9 | path: Assets/Scenes/SampleScene.unity 10 | guid: 2cda990e2423bbf4892e6590ba056729 11 | m_configObjects: {} 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/AquariumActor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: df3d5be31bb647e9a820c0d5d8612761 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/FishFactory.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3427deceae574b599068c5859e89e76d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Lophophorata.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 949fa22d1a89448c86c0052e9ac3d161 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/AquariumComponent.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ea38f4eb83914b4c850ab23eb262dd87 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Mover/BoidNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 77b52fbc427549419413c004c5e43863 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Scene/AquariumScene.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b37548550c864bba939a8024c3935ffe 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/UniAquariumSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ab4a6a2138da4adc808e6f8dc1be5726 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/IPressable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e427163584dc4cd5b325874e344b5bdc 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/ITransform.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 921f672e75e14fbda6f056f29fcb3f2d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/ReceiverNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0feee72bbacc487bba8a1bb08adeaf13 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/RenderNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f190e33738ee4615a13519900bd8adb9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/SpawnerNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7a992ec0e4fa454c9f2383d49693978d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Scene/CanvasScene.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3bbbcafe75744e1ab4c63c81611b9080 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Scene/ISceneOption.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b8d5f60c02c84aabbf4aa74dd9fa4957 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Spawner/FoodSpawner.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0056b9fc669844d1ba249e390d6b5e6b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Scene/AquariumSceneOption.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6acbafb9ba73490e9745d0faaf8b5cd1 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/IDestroyable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e1a4e61fdb294d89920bf521d50405c4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/IInstantiable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2886e4490fd24914b23b7233b13d9cbc 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/ITransform.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | public interface ITransform 6 | { 7 | Vector2 Position { get; set; } 8 | Vector2 Velocity { get; set; } 9 | float Rotation { get; set; } 10 | float Scale { get; set; } 11 | } 12 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Scene/ISceneUtility.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 32568f26b0e04edc9f5bf0d546d43e8c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Painter2D/Painter2DScope.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 87178a9557624f44b0396779e5a26f28 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Times/EditorDeltaTime.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 913a6ed2516e4e34abe5444e42c8757f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Spawner/ShockwaveSpawner.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4cb0264ac74e40e89304e2770451238c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Mover/SwayFallingNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 85ed9f2b95c64d25922b7a63692d5196 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Mover/TargetTrackingNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e6a445ca216c4ab38a3dfee1d87e5f09 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Receiver/FoodReceiverNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: adf0c115930c4241878881753fcf7e15 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/BranchShape.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 46bf757a6e02f80499f46901801211e0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/FishShape.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b9109090ce09a15419f5f2bb2484fd0f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/FoodShape.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f3afd11acfa1fc34cba86f27597acefd 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Spawner/FoodSpawnerNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 21566c7fbc40424da1a2edf6b7fa4711 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Components/CanvasSceneComponent.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 504ee1bc3a2a4ccaba833eca2c7720fe 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Painter2D/Painter2DExtension.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f90b0c206d72436fa291bec8c2e3dbf0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Receiver/ShockwaveReceiverNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a34634c2191047238b6e39cd7ecb0707 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/CompositeShape.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6b5fdacddaaa1954082088ad80871fb0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/JellyFishShape.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 399725269dbed0248b7a5f55be0508b0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/MarbleCircle.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0628332df30dde64c96452fc95ce1cfa 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Spawner/ShockwaveSpawnerNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 72548b4a56814c60966c08fb81deefd3 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Times/EditorDeltaTimeInitializer.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 57b951a30ca343fe9ea020414dd66504 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/LophophorataShape.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4920ccce22e32154f992fb0fc0c07afd 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Scene/ISceneUtility.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | public interface ISceneUtility where TActor : IActor 6 | { 7 | TActor GetActor() where T : TActor; 8 | void Instantiate(T actor, Vector2? location, float angle, float scale) where T : IActor; 9 | } 10 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.garume.uniaquarium", 3 | "displayName": "UniAquarium", 4 | "version": "1.0.1", 5 | "unity": "2022.1", 6 | "license": "MIT", 7 | "dependencies": { 8 | }, 9 | "author": { 10 | "name": "Garume", 11 | "url": "https://github.com/Garume" 12 | }, 13 | "type": "tool", 14 | "description": "Create your aquarium in Unity Editor." 15 | } -------------------------------------------------------------------------------- /ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | m_CompiledVersion: 0 14 | m_RuntimeVersion: 0 15 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/UniAquarium.Editor.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "UniAquarium.Editor", 3 | "rootNamespace": "", 4 | "references": [], 5 | "includePlatforms": [ 6 | "Editor" 7 | ], 8 | "excludePlatforms": [], 9 | "allowUnsafeCode": false, 10 | "overrideReferences": false, 11 | "precompiledReferences": [], 12 | "autoReferenced": true, 13 | "defineConstraints": [], 14 | "versionDefines": [], 15 | "noEngineReferences": false 16 | } -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 0 20 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/ReceiverNode.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine.UIElements; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | internal abstract class ReceiverNode : Node where TOption : ISceneOption 6 | { 7 | public T ReceivedItem { get; private set; } 8 | 9 | public override void Draw(Painter2D painter, float deltaTime) 10 | { 11 | } 12 | 13 | protected abstract T UpdateReceived(); 14 | 15 | public override void Update(float deltaTime) 16 | { 17 | ReceivedItem = UpdateReceived(); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Spawner/ShockwaveSpawnerNode.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Aquarium.Actors; 2 | using UniAquarium.Aquarium.Scene; 3 | using UniAquarium.Core.Paints; 4 | using UnityEngine.UIElements; 5 | 6 | namespace UniAquarium.Aquarium.Nodes 7 | { 8 | internal class ShockwaveSpawnerNode : SpawnerNode, IPressable 9 | { 10 | public void Press(MouseDownEvent evt) 11 | { 12 | Spawn(evt.mousePosition); 13 | } 14 | 15 | protected override Shockwave CreateActor() 16 | { 17 | return new Shockwave(SceneOption, 30f); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/RenderNode.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine.UIElements; 2 | 3 | namespace UniAquarium.Core.Paints 4 | { 5 | internal sealed class RenderNode : Node where TOption : ISceneOption 6 | { 7 | private readonly Shape _shape; 8 | 9 | public RenderNode(Shape shape) 10 | { 11 | _shape = shape; 12 | } 13 | 14 | public override void Draw(Painter2D painter, float deltaTime) 15 | { 16 | _shape.Draw(painter, Transform, deltaTime); 17 | } 18 | 19 | public override void Update(float deltaTime) 20 | { 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Spawner/ShockwaveSpawner.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Nodes; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | 6 | namespace UniAquarium.Aquarium.Actors 7 | { 8 | internal class ShockwaveSpawner : AquariumActor 9 | { 10 | public ShockwaveSpawner(AquariumSceneOption sceneOption) : base(sceneOption) 11 | { 12 | } 13 | 14 | protected override IEnumerable CreateNodes() 15 | { 16 | return new INode[] 17 | { 18 | new ShockwaveSpawnerNode() 19 | }; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/AquariumActor.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Scene; 3 | using UniAquarium.Core.Paints; 4 | 5 | namespace UniAquarium.Aquarium.Actors 6 | { 7 | public abstract class AquariumActor : Actor 8 | { 9 | protected AquariumActor(AquariumSceneOption sceneOption) : base(sceneOption) 10 | { 11 | } 12 | 13 | public override void Initialize() 14 | { 15 | var nodes = CreateNodes(); 16 | AddNodes(nodes); 17 | base.Initialize(); 18 | } 19 | 20 | protected abstract IEnumerable CreateNodes(); 21 | } 22 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Spawner/FoodSpawner.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Nodes; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | using UnityEngine.UIElements; 6 | 7 | namespace UniAquarium.Aquarium.Actors 8 | { 9 | internal sealed class FoodSpawner : AquariumActor 10 | { 11 | public FoodSpawner(AquariumSceneOption sceneOption) : base(sceneOption) 12 | { 13 | } 14 | 15 | protected override IEnumerable CreateNodes() 16 | { 17 | return new INode[] 18 | { 19 | new FoodSpawnerNode() 20 | }; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Spawner/FoodSpawnerNode.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Aquarium.Actors; 2 | using UniAquarium.Aquarium.Scene; 3 | using UniAquarium.Core.Paints; 4 | using UnityEngine; 5 | using UnityEngine.UIElements; 6 | 7 | namespace UniAquarium.Aquarium.Nodes 8 | { 9 | internal sealed class FoodSpawnerNode : SpawnerNode, IPressable 10 | { 11 | public void Press(MouseDownEvent evt) 12 | { 13 | var location = new Vector2(evt.mousePosition.x, 0); 14 | Spawn(location); 15 | } 16 | 17 | protected override Food CreateActor() 18 | { 19 | return new Food(SceneOption); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/FishFactory.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Aquarium.Scene; 2 | using UniAquarium.Core.Paints; 3 | 4 | namespace UniAquarium.Aquarium.Actors 5 | { 6 | internal static class FishFactory 7 | { 8 | internal static IActor Create(FishSetting fishSetting, AquariumSceneOption sceneOption) 9 | { 10 | return fishSetting.FishType switch 11 | { 12 | FishType.Fish => new Fish(fishSetting.Color, sceneOption), 13 | FishType.JellyFish => new JellyFish(fishSetting.Color, sceneOption), 14 | FishType.Lophophorata => new Lophophorata(fishSetting.Color, sceneOption), 15 | _ => null 16 | }; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Scene/AquariumSceneOption.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Aquarium.Actors; 2 | using UniAquarium.Core.Paints; 3 | 4 | namespace UniAquarium.Aquarium.Scene 5 | { 6 | public sealed class AquariumSceneOption : ISceneOption 7 | { 8 | public AquariumSceneOption(float width, float height, ISceneUtility utility, 9 | bool isDebug = false) 10 | { 11 | Width = width; 12 | Height = height; 13 | Utility = utility; 14 | IsDebug = isDebug; 15 | } 16 | 17 | public bool IsDebug { get; set; } 18 | public float TimeScale { get; set; } = 1f; 19 | public float Width { get; } 20 | public float Height { get; } 21 | public ISceneUtility Utility { get; } 22 | } 23 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Lophophorata.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Nodes; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | using UnityEngine; 6 | 7 | namespace UniAquarium.Aquarium.Actors 8 | { 9 | internal sealed class Lophophorata : AquariumActor 10 | { 11 | private readonly Color _color; 12 | 13 | public Lophophorata(Color color, AquariumSceneOption sceneOption) : base(sceneOption) 14 | { 15 | _color = color; 16 | } 17 | 18 | protected override IEnumerable CreateNodes() 19 | { 20 | return new INode[] 21 | { 22 | new RenderNode(new LophophorataShape(_color, 20)) 23 | }; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/JellyFish.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Nodes; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | using UnityEngine; 6 | 7 | namespace UniAquarium.Aquarium.Actors 8 | { 9 | internal sealed class JellyFish : AquariumActor 10 | { 11 | private readonly Color _color; 12 | 13 | public JellyFish(Color color, AquariumSceneOption sceneOption) : base(sceneOption) 14 | { 15 | _color = color; 16 | } 17 | 18 | protected override IEnumerable CreateNodes() 19 | { 20 | return new INode[] 21 | { 22 | new RenderNode(new JellyFishShape(_color)), 23 | new TargetTrackingNode(0.01f) 24 | }; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/FoodShape.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Core.Paints; 2 | using UnityEngine.UIElements; 3 | using ITransform = UniAquarium.Core.Paints.ITransform; 4 | using Random = UnityEngine.Random; 5 | 6 | namespace UniAquarium.Aquarium.Nodes 7 | { 8 | internal sealed class FoodShape : Shape 9 | { 10 | private readonly Shape _shape; 11 | 12 | public FoodShape(float size = 3f) 13 | { 14 | _shape = new MarbleCircle(new[] 15 | { 16 | Random.ColorHSV(), 17 | Random.ColorHSV(), 18 | Random.ColorHSV(), 19 | Random.ColorHSV() 20 | }, size); 21 | } 22 | 23 | public override void Draw(Painter2D painter, ITransform transform, float deltaTime) 24 | { 25 | _shape.Draw(painter, transform, deltaTime); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Food.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Nodes; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | 6 | namespace UniAquarium.Aquarium.Actors 7 | { 8 | internal sealed class Food : AquariumActor 9 | { 10 | public Food(AquariumSceneOption sceneOption) : base(sceneOption) 11 | { 12 | } 13 | 14 | public INode TargetNode { get; set; } 15 | 16 | protected override IEnumerable CreateNodes() 17 | { 18 | return new INode[] 19 | { 20 | new RenderNode(new FoodShape()), 21 | new SwayFallingNode(12f, 4f) 22 | }; 23 | } 24 | 25 | public override void Update(float deltaTime) 26 | { 27 | base.Update(deltaTime); 28 | 29 | if (Position.y > SceneOption.Height) Destroy(); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Mover/SwayFallingNode.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Aquarium.Scene; 2 | using UniAquarium.Core.Paints; 3 | using UnityEngine; 4 | 5 | namespace UniAquarium.Aquarium.Nodes 6 | { 7 | internal sealed class SwayFallingNode : Node 8 | { 9 | private readonly float _speed; 10 | private readonly float _waveWidth; 11 | private float _waveOffset; 12 | 13 | public SwayFallingNode(float speed = 0.5f, float waveWidth = 1f) 14 | { 15 | _speed = speed; 16 | _waveWidth = waveWidth; 17 | } 18 | 19 | public override void Update(float deltaTime) 20 | { 21 | _waveOffset += 0.01f; 22 | 23 | var toX = Mathf.Sin(_waveOffset) * _waveWidth * deltaTime + Transform.Position.x; 24 | var toY = _speed * deltaTime + Transform.Position.y; 25 | 26 | Transform.Position = new Vector2(toX, toY); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/LophophorataShape.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Core.Paints; 2 | using UnityEngine; 3 | using UnityEngine.UIElements; 4 | using ITransform = UniAquarium.Core.Paints.ITransform; 5 | using Random = UnityEngine.Random; 6 | 7 | namespace UniAquarium.Aquarium.Nodes 8 | { 9 | internal class LophophorataShape : Shape 10 | { 11 | private readonly CompositeShape _compositeShape; 12 | 13 | public LophophorataShape(Color color, int branchCount = 10) 14 | { 15 | _compositeShape = new CompositeShape { new MarbleCircle(new[] { color }, 5f) }; 16 | 17 | for (var i = 0; i < branchCount; i++) 18 | _compositeShape.Add(new BranchShape(color, Random.Range(0f, 360f), 0.01f)); 19 | } 20 | 21 | public override void Draw(Painter2D painter, ITransform transform, float deltaTime) 22 | { 23 | _compositeShape.Draw(painter, transform, deltaTime); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Boid.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Nodes; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | 6 | namespace UniAquarium.Aquarium.Actors 7 | { 8 | internal sealed class Boid : AquariumActor 9 | { 10 | private BoidNode _boidNode; 11 | 12 | public Boid(AquariumSceneOption sceneOption) : base(sceneOption) 13 | { 14 | } 15 | 16 | protected override IEnumerable CreateNodes() 17 | { 18 | _boidNode = new BoidNode(0.5f, 10f, 0.2f); 19 | var trackingNode = new TargetTrackingNode(0.3f); 20 | return new INode[] 21 | { 22 | _boidNode, 23 | trackingNode 24 | }; 25 | } 26 | 27 | public void AddTrackingNode(TargetTrackingNode targetTrackingNode) 28 | { 29 | _boidNode.AddTrackingNode(targetTrackingNode); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_DashboardUrl: https://dashboard.unity3d.com 13 | m_TestInitMode: 0 14 | CrashReportingSettings: 15 | m_EventUrl: https://perf-events.cloud.unity3d.com 16 | m_Enabled: 0 17 | m_LogBufferSize: 10 18 | m_CaptureEditorExceptions: 1 19 | UnityPurchasingSettings: 20 | m_Enabled: 0 21 | m_TestMode: 0 22 | UnityAnalyticsSettings: 23 | m_Enabled: 0 24 | m_TestMode: 0 25 | m_InitializeOnStartup: 1 26 | m_PackageRequiringCoreStatsPresent: 0 27 | UnityAdsSettings: 28 | m_Enabled: 0 29 | m_InitializeOnStartup: 1 30 | m_TestMode: 0 31 | m_IosGameId: 32 | m_AndroidGameId: 33 | m_GameIds: {} 34 | m_GameId: 35 | PerformanceReportingSettings: 36 | m_Enabled: 0 37 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/SpawnerNode.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using UnityEngine.UIElements; 4 | 5 | namespace UniAquarium.Core.Paints 6 | { 7 | internal abstract class SpawnerNode : Node where T : IActor where TOption : ISceneOption 8 | { 9 | public List Actors { get; } = new(); 10 | 11 | public override void Update(float deltaTime) 12 | { 13 | for (var index = 0; index < Actors.Count; index++) 14 | { 15 | var actor = Actors[index]; 16 | if (actor.IsDestroyed) 17 | Actors.Remove(actor); 18 | } 19 | } 20 | 21 | public override void Draw(Painter2D painter, float deltaTime) 22 | { 23 | } 24 | 25 | protected void Spawn(Vector2? location, float angle = 0, float scale = 1) 26 | { 27 | var actor = CreateActor(); 28 | actor.Instantiate(location, angle, scale); 29 | Actors.Add(actor); 30 | } 31 | 32 | protected abstract T CreateActor(); 33 | } 34 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Garume 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Times/EditorDeltaTimeInitializer.cs: -------------------------------------------------------------------------------- 1 | // Reference: https://github.com/breadnone/EditorDeltaTime 2 | 3 | using UnityEditor; 4 | 5 | namespace UniAquarium.Foundation 6 | { 7 | [InitializeOnLoad] 8 | internal static class EditorDeltaTimeInitializer 9 | { 10 | static EditorDeltaTimeInitializer() 11 | { 12 | EditorApplication.playModeStateChanged += PlayModeState; 13 | EditorDeltaTime.Start(); 14 | } 15 | 16 | private static void PlayModeState(PlayModeStateChange state) 17 | { 18 | switch (state) 19 | { 20 | case PlayModeStateChange.EnteredPlayMode: 21 | case PlayModeStateChange.ExitingEditMode: 22 | EditorDeltaTime.Stop(); 23 | break; 24 | case PlayModeStateChange.ExitingPlayMode: 25 | case PlayModeStateChange.EnteredEditMode: 26 | EditorDeltaTime.Start(); 27 | break; 28 | default: 29 | EditorDeltaTime.Start(); 30 | break; 31 | } 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Fish.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Nodes; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | using UnityEngine; 6 | 7 | namespace UniAquarium.Aquarium.Actors 8 | { 9 | internal sealed class Fish : AquariumActor 10 | { 11 | private readonly Color _color; 12 | 13 | public Fish(Color color, AquariumSceneOption sceneOption) : base(sceneOption) 14 | { 15 | _color = color; 16 | } 17 | 18 | protected override IEnumerable CreateNodes() 19 | { 20 | var targetTrackingNode = new TargetTrackingNode(0.1f); 21 | var shockwaveReceiverNode = new ShockwaveReceiverNode(); 22 | var foodReceiverNode = new FoodReceiverNode(); 23 | targetTrackingNode.AddReceiver(shockwaveReceiverNode); 24 | targetTrackingNode.AddReceiver(foodReceiverNode); 25 | 26 | return new INode[] 27 | { 28 | new RenderNode(new FishShape(_color)), 29 | targetTrackingNode, 30 | foodReceiverNode, 31 | shockwaveReceiverNode 32 | }; 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreReleasePackages: 0 16 | m_EnablePackageDependencies: 0 17 | m_AdvancedSettingsExpanded: 1 18 | m_ScopedRegistriesSettingsExpanded: 1 19 | m_SeeAllPackageVersions: 0 20 | oneTimeWarningShown: 0 21 | m_Registries: 22 | - m_Id: main 23 | m_Name: 24 | m_Url: https://packages.unity.com 25 | m_Scopes: [] 26 | m_IsDefault: 1 27 | m_Capabilities: 7 28 | m_UserSelectedRegistryName: 29 | m_UserAddingNewScopedRegistry: 0 30 | m_RegistryInfoDraft: 31 | m_ErrorMessage: 32 | m_Original: 33 | m_Id: 34 | m_Name: 35 | m_Url: 36 | m_Scopes: [] 37 | m_IsDefault: 0 38 | m_Capabilities: 0 39 | m_Modified: 0 40 | m_Name: 41 | m_Url: 42 | m_Scopes: 43 | - 44 | m_SelectedScopeIndex: 0 45 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/MarbleCircle.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Core.Paints; 2 | using UniAquarium.Foundation; 3 | using UnityEngine; 4 | using UnityEngine.UIElements; 5 | using ITransform = UniAquarium.Core.Paints.ITransform; 6 | 7 | namespace UniAquarium.Aquarium.Nodes 8 | { 9 | internal sealed class MarbleCircle : Shape 10 | { 11 | private readonly Color[] _colors; 12 | 13 | private readonly float _size; 14 | 15 | 16 | public MarbleCircle(Color[] colors, float size = 1f, float opacity = 1f) 17 | { 18 | _colors = colors; 19 | _size = size; 20 | Opacity = opacity; 21 | } 22 | 23 | public float Opacity { get; set; } 24 | 25 | public override void Draw(Painter2D painter, ITransform transform, float deltaTime) 26 | { 27 | var size = transform.Scale * _size; 28 | var bias = 1 / _colors.Length; 29 | foreach (var color in _colors) 30 | { 31 | var c = color; 32 | c.a = Opacity; 33 | painter.fillColor = c; 34 | painter.FillCircle(transform.Position.x, transform.Position.y, size); 35 | size -= Mathf.Max(0, size - size * bias); 36 | } 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /ProjectSettings/MemorySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!387306366 &1 4 | MemorySettings: 5 | m_ObjectHideFlags: 0 6 | m_EditorMemorySettings: 7 | m_MainAllocatorBlockSize: -1 8 | m_ThreadAllocatorBlockSize: -1 9 | m_MainGfxBlockSize: -1 10 | m_ThreadGfxBlockSize: -1 11 | m_CacheBlockSize: -1 12 | m_TypetreeBlockSize: -1 13 | m_ProfilerBlockSize: -1 14 | m_ProfilerEditorBlockSize: -1 15 | m_BucketAllocatorGranularity: -1 16 | m_BucketAllocatorBucketsCount: -1 17 | m_BucketAllocatorBlockSize: -1 18 | m_BucketAllocatorBlockCount: -1 19 | m_ProfilerBucketAllocatorGranularity: -1 20 | m_ProfilerBucketAllocatorBucketsCount: -1 21 | m_ProfilerBucketAllocatorBlockSize: -1 22 | m_ProfilerBucketAllocatorBlockCount: -1 23 | m_TempAllocatorSizeMain: -1 24 | m_JobTempAllocatorBlockSize: -1 25 | m_BackgroundJobTempAllocatorBlockSize: -1 26 | m_JobTempAllocatorReducedBlockSize: -1 27 | m_TempAllocatorSizeGIBakingWorker: -1 28 | m_TempAllocatorSizeNavMeshWorker: -1 29 | m_TempAllocatorSizeAudioWorker: -1 30 | m_TempAllocatorSizeCloudWorker: -1 31 | m_TempAllocatorSizeGfx: -1 32 | m_TempAllocatorSizeJobWorker: -1 33 | m_TempAllocatorSizeBackgroundWorker: -1 34 | m_TempAllocatorSizePreloadManager: -1 35 | m_PlatformMemorySettings: {} 36 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_SerializationMode: 2 8 | m_LineEndingsForNewScripts: 0 9 | m_DefaultBehaviorMode: 1 10 | m_PrefabRegularEnvironment: {fileID: 0} 11 | m_PrefabUIEnvironment: {fileID: 0} 12 | m_SpritePackerMode: 5 13 | m_SpritePackerPaddingPower: 1 14 | m_EtcTextureCompressorBehavior: 1 15 | m_EtcTextureFastCompressor: 1 16 | m_EtcTextureNormalCompressor: 2 17 | m_EtcTextureBestCompressor: 4 18 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp 19 | m_ProjectGenerationRootNamespace: 20 | m_EnableTextureStreamingInEditMode: 1 21 | m_EnableTextureStreamingInPlayMode: 1 22 | m_AsyncShaderCompilation: 1 23 | m_CachingShaderPreprocessor: 1 24 | m_PrefabModeAllowAutoSave: 1 25 | m_EnterPlayModeOptionsEnabled: 0 26 | m_EnterPlayModeOptions: 3 27 | m_GameObjectNamingDigits: 1 28 | m_GameObjectNamingScheme: 0 29 | m_AssetNamingUsesSpace: 1 30 | m_UseLegacyProbeSampleCount: 0 31 | m_SerializeInlineMappingsOnOneLine: 1 32 | m_DisableCookiesInLightmapper: 1 33 | m_AssetPipelineMode: 1 34 | m_CacheServerMode: 0 35 | m_CacheServerEndpoint: 36 | m_CacheServerNamespacePrefix: default 37 | m_CacheServerEnableDownload: 1 38 | m_CacheServerEnableUpload: 1 39 | m_CacheServerEnableAuth: 0 40 | m_CacheServerEnableTls: 0 41 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Nodes/Node.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine.UIElements; 3 | 4 | namespace UniAquarium.Core.Paints 5 | { 6 | internal class Node : INode, IEquatable where TOption : ISceneOption 7 | { 8 | private readonly Guid _id = Guid.NewGuid(); 9 | 10 | public TOption SceneOption { get; private set; } 11 | public ITransform Transform { get; private set; } 12 | 13 | public bool Equals(INode other) 14 | { 15 | return other != null && _id.Equals(other.Id); 16 | } 17 | 18 | public virtual void Draw(Painter2D painter, float deltaTime) 19 | { 20 | } 21 | 22 | public virtual void Update(float deltaTime) 23 | { 24 | } 25 | 26 | Guid INode.Id => _id; 27 | 28 | public void Initialize(ITransform transform, ISceneOption sceneOption) 29 | { 30 | Transform = transform; 31 | SceneOption = (TOption)sceneOption; 32 | } 33 | 34 | 35 | public override bool Equals(object obj) 36 | { 37 | if (ReferenceEquals(null, obj)) return false; 38 | if (ReferenceEquals(this, obj)) return true; 39 | return obj.GetType() == GetType() && Equals((INode)obj); 40 | } 41 | 42 | public override int GetHashCode() 43 | { 44 | return _id.GetHashCode(); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_DefaultMaxDepenetrationVelocity: 10 11 | m_SleepThreshold: 0.005 12 | m_DefaultContactOffset: 0.01 13 | m_DefaultSolverIterations: 6 14 | m_DefaultSolverVelocityIterations: 1 15 | m_QueriesHitBackfaces: 0 16 | m_QueriesHitTriggers: 1 17 | m_EnableAdaptiveForce: 0 18 | m_ClothInterCollisionDistance: 0.1 19 | m_ClothInterCollisionStiffness: 0.2 20 | m_ContactsGeneration: 1 21 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 22 | m_AutoSimulation: 1 23 | m_AutoSyncTransforms: 0 24 | m_ReuseCollisionCallbacks: 1 25 | m_ClothInterCollisionSettingsToggle: 0 26 | m_ClothGravity: {x: 0, y: -9.81, z: 0} 27 | m_ContactPairsMode: 0 28 | m_BroadphaseType: 0 29 | m_WorldBounds: 30 | m_Center: {x: 0, y: 0, z: 0} 31 | m_Extent: {x: 250, y: 250, z: 250} 32 | m_WorldSubdivisions: 8 33 | m_FrictionType: 0 34 | m_EnableEnhancedDeterminism: 0 35 | m_EnableUnifiedHeightmaps: 1 36 | m_SolverType: 0 37 | m_DefaultMaxAngularSpeed: 50 38 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/CompositeShape.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UniAquarium.Core.Paints; 4 | using UnityEngine.UIElements; 5 | using ITransform = UniAquarium.Core.Paints.ITransform; 6 | 7 | namespace UniAquarium.Aquarium.Nodes 8 | { 9 | internal class CompositeShape : Shape, ICollection 10 | { 11 | private readonly List _shapes = new(); 12 | 13 | public int Count => _shapes.Count; 14 | 15 | public bool IsReadOnly => false; 16 | 17 | public void Add(Shape item) 18 | { 19 | _shapes.Add(item); 20 | } 21 | 22 | public void Clear() 23 | { 24 | _shapes.Clear(); 25 | } 26 | 27 | public bool Contains(Shape item) 28 | { 29 | return _shapes.Contains(item); 30 | } 31 | 32 | public void CopyTo(Shape[] array, int arrayIndex) 33 | { 34 | _shapes.CopyTo(array, arrayIndex); 35 | } 36 | 37 | public bool Remove(Shape item) 38 | { 39 | return _shapes.Remove(item); 40 | } 41 | 42 | public IEnumerator GetEnumerator() 43 | { 44 | return _shapes.GetEnumerator(); 45 | } 46 | 47 | IEnumerator IEnumerable.GetEnumerator() 48 | { 49 | return GetEnumerator(); 50 | } 51 | 52 | public override void Draw(Painter2D painter, ITransform transform, float deltaTime) 53 | { 54 | foreach (var shape in _shapes) shape.Draw(painter, transform, deltaTime); 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Actors/Shockwave.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Nodes; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | using UnityEngine; 6 | 7 | namespace UniAquarium.Aquarium.Actors 8 | { 9 | internal sealed class Shockwave : AquariumActor 10 | { 11 | private readonly float _growingSpeed; 12 | private readonly MarbleCircle _shape; 13 | 14 | public Shockwave(AquariumSceneOption sceneOption, float growingSpeed = 1) : base(sceneOption) 15 | { 16 | _growingSpeed = growingSpeed; 17 | var colors = new Color[6]; 18 | for (var i = 0; i < colors.Length; i++) 19 | { 20 | Color.RGBToHSV(Random.ColorHSV(), out var h, out var s, out var v); 21 | var color = Color.HSVToRGB(h, 22 | s - 0.3f + Random.Range(0f, 1f) * 0.3f, 23 | v - 0.5f + Random.Range(0f, 1f) * 0.5f); 24 | colors[i] = color; 25 | } 26 | 27 | _shape = new MarbleCircle(colors); 28 | } 29 | 30 | protected override IEnumerable CreateNodes() 31 | { 32 | return new INode[] 33 | { 34 | new RenderNode(_shape) 35 | }; 36 | } 37 | 38 | public override void Update(float deltaTime) 39 | { 40 | base.Update(deltaTime); 41 | 42 | _shape.Opacity -= deltaTime * 0.5f; 43 | Scale += _growingSpeed * deltaTime; 44 | 45 | if (_shape.Opacity <= 0) Destroy(); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Uu]ser[Ss]ettings/ 12 | 13 | # MemoryCaptures can get excessive in size. 14 | # They also could contain extremely sensitive data 15 | /[Mm]emoryCaptures/ 16 | 17 | # Asset meta data should only be ignored when the corresponding asset is also ignored 18 | !/[Aa]ssets/**/*.meta 19 | 20 | # Uncomment this line if you wish to ignore the asset store tools plugin 21 | # /[Aa]ssets/AssetStoreTools* 22 | 23 | # Autogenerated Jetbrains Rider plugin 24 | /[Aa]ssets/Plugins/Editor/JetBrains* 25 | 26 | # Visual Studio cache directory 27 | .vs/ 28 | 29 | # Gradle cache directory 30 | .gradle/ 31 | 32 | # Autogenerated VS/MD/Consulo solution and project files 33 | ExportedObj/ 34 | .consulo/ 35 | *.csproj 36 | *.unityproj 37 | *.sln 38 | *.suo 39 | *.tmp 40 | *.user 41 | *.userprefs 42 | *.pidb 43 | *.booproj 44 | *.svd 45 | *.pdb 46 | *.mdb 47 | *.opendb 48 | *.VC.db 49 | 50 | # Unity3D generated meta files 51 | *.pidb.meta 52 | *.pdb.meta 53 | *.mdb.meta 54 | 55 | # Unity3D generated file on crash reports 56 | sysinfo.txt 57 | 58 | # Builds 59 | *.apk 60 | *.aab 61 | *.unitypackage 62 | 63 | # Crashlytics generated file 64 | crashlytics-build.properties 65 | 66 | # Packed Addressables 67 | /[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* 68 | 69 | # Temporary auto-generated Android Assets 70 | /[Aa]ssets/[Ss]treamingAssets/aa.meta 71 | /[Aa]ssets/[Ss]treamingAssets/aa/* 72 | 73 | .idea/ 74 | *.DotSettings 75 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/AquariumWindow.cs: -------------------------------------------------------------------------------- 1 | using UnityEditor; 2 | using UnityEngine; 3 | 4 | namespace UniAquarium.Aquarium 5 | { 6 | public sealed class AquariumWindow : EditorWindow, IHasCustomMenu 7 | { 8 | private AquariumComponent _aquariumComponent; 9 | 10 | public void OnEnable() 11 | { 12 | _aquariumComponent = new AquariumComponent(); 13 | rootVisualElement.Add(_aquariumComponent); 14 | 15 | _aquariumComponent.Enable(); 16 | } 17 | 18 | public void OnDisable() 19 | { 20 | _aquariumComponent.Dispose(); 21 | } 22 | 23 | public void AddItemsToMenu(GenericMenu menu) 24 | { 25 | menu.AddItem(new GUIContent("Debug"), _aquariumComponent.SceneOption.IsDebug, 26 | () => { _aquariumComponent.SceneOption.IsDebug = !_aquariumComponent.SceneOption.IsDebug; }); 27 | menu.AddItem(new GUIContent("Reload"), false, () => 28 | { 29 | rootVisualElement.Remove(_aquariumComponent); 30 | _aquariumComponent.Dispose(); 31 | _aquariumComponent = new AquariumComponent(); 32 | rootVisualElement.Add(_aquariumComponent); 33 | _aquariumComponent.Enable(); 34 | }); 35 | } 36 | 37 | [MenuItem("Window/Aquarium")] 38 | public static void OpenWindow() 39 | { 40 | Open(); 41 | } 42 | 43 | private static void Open() 44 | { 45 | var window = GetWindow(); 46 | window.titleContent = new GUIContent("Aquarium"); 47 | window.Show(); 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | maxJobWorkers: 0 89 | preserveTilesOutsideBounds: 0 90 | debug: 91 | m_Flags: 0 92 | m_SettingNames: 93 | - Humanoid 94 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Scene/CanvasScene.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using UnityEngine.UIElements; 4 | 5 | namespace UniAquarium.Core.Paints 6 | { 7 | public abstract class CanvasScene : IPaintable, ISceneUtility where TActor : IActor 8 | { 9 | private readonly List _paintables = new(); 10 | 11 | public void Draw(Painter2D painter, float deltaTime) 12 | { 13 | foreach (var paintable in _paintables) paintable.Draw(painter, deltaTime); 14 | } 15 | 16 | public void Update(float deltaTime) 17 | { 18 | for (var index = 0; index < _paintables.Count; index++) 19 | { 20 | var paintable = _paintables[index]; 21 | paintable.Update(deltaTime); 22 | 23 | if (paintable is IDestroyable { IsDestroyed: true }) _paintables.RemoveAt(index); 24 | } 25 | } 26 | 27 | public void Instantiate(T actor, Vector2? location, float angle, float scale) where T : IActor 28 | { 29 | actor.Position = location ?? Vector2.zero; 30 | actor.Rotation = angle; 31 | actor.Scale = scale; 32 | actor.Initialize(); 33 | 34 | _paintables.Add(actor); 35 | } 36 | 37 | TActor ISceneUtility.GetActor() 38 | { 39 | return (T)_paintables.Find(actor => actor is T); 40 | } 41 | 42 | public void Press(MouseDownEvent evt) 43 | { 44 | for (var index = 0; index < _paintables.Count; index++) 45 | { 46 | var actor = _paintables[index]; 47 | if (actor is IPressable pressable) 48 | pressable.Press(evt); 49 | } 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.collab-proxy": "2.0.7", 4 | "com.unity.feature.2d": "2.0.0", 5 | "com.unity.ide.rider": "3.0.24", 6 | "com.unity.ide.visualstudio": "2.0.18", 7 | "com.unity.test-framework": "1.1.33", 8 | "com.unity.textmeshpro": "3.0.6", 9 | "com.unity.timeline": "1.7.5", 10 | "com.unity.ugui": "1.0.0", 11 | "com.unity.visualscripting": "1.9.0", 12 | "com.unity.modules.ai": "1.0.0", 13 | "com.unity.modules.androidjni": "1.0.0", 14 | "com.unity.modules.animation": "1.0.0", 15 | "com.unity.modules.assetbundle": "1.0.0", 16 | "com.unity.modules.audio": "1.0.0", 17 | "com.unity.modules.cloth": "1.0.0", 18 | "com.unity.modules.director": "1.0.0", 19 | "com.unity.modules.imageconversion": "1.0.0", 20 | "com.unity.modules.imgui": "1.0.0", 21 | "com.unity.modules.jsonserialize": "1.0.0", 22 | "com.unity.modules.particlesystem": "1.0.0", 23 | "com.unity.modules.physics": "1.0.0", 24 | "com.unity.modules.physics2d": "1.0.0", 25 | "com.unity.modules.screencapture": "1.0.0", 26 | "com.unity.modules.terrain": "1.0.0", 27 | "com.unity.modules.terrainphysics": "1.0.0", 28 | "com.unity.modules.tilemap": "1.0.0", 29 | "com.unity.modules.ui": "1.0.0", 30 | "com.unity.modules.uielements": "1.0.0", 31 | "com.unity.modules.umbra": "1.0.0", 32 | "com.unity.modules.unityanalytics": "1.0.0", 33 | "com.unity.modules.unitywebrequest": "1.0.0", 34 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 35 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 36 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 37 | "com.unity.modules.unitywebrequestwww": "1.0.0", 38 | "com.unity.modules.vehicles": "1.0.0", 39 | "com.unity.modules.video": "1.0.0", 40 | "com.unity.modules.vr": "1.0.0", 41 | "com.unity.modules.wind": "1.0.0", 42 | "com.unity.modules.xr": "1.0.0" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Times/EditorDeltaTime.cs: -------------------------------------------------------------------------------- 1 | // Reference: https://github.com/breadnone/EditorDeltaTime 2 | 3 | using UnityEditor; 4 | using UnityEngine; 5 | 6 | namespace UniAquarium.Foundation 7 | { 8 | internal static class EditorDeltaTime 9 | { 10 | private static float _lastTime; 11 | private static float _screenRate; 12 | 13 | internal static float DeltaTime { get; private set; } 14 | 15 | internal static long FrameCount { get; private set; } 16 | 17 | internal static bool Paused { get; private set; } 18 | 19 | public static void Start() 20 | { 21 | Stop(); 22 | GetScreenRate(); 23 | _lastTime = 0; 24 | FrameCount = 0; 25 | GetScreenRate(); 26 | DeltaTime = 0; 27 | Paused = false; 28 | 29 | EditorApplication.update += EditModeRunner; 30 | } 31 | 32 | public static void Stop() 33 | { 34 | EditorApplication.update -= EditModeRunner; 35 | } 36 | 37 | public static void Pause(bool state) 38 | { 39 | Paused = state; 40 | } 41 | 42 | private static void GetScreenRate() 43 | { 44 | var refValue = Screen.currentResolution.refreshRateRatio.value; 45 | _screenRate = 1f / (float)refValue; 46 | } 47 | 48 | private static void EditModeRunner() 49 | { 50 | if (Paused || EditorApplication.isPlayingOrWillChangePlaymode || EditorApplication.isCompiling || 51 | EditorApplication.isUpdating || EditorApplication.isPlaying) return; 52 | 53 | var time = (float)EditorApplication.timeSinceStartup; 54 | 55 | if (time < _lastTime + _screenRate) return; 56 | 57 | var min = time - _lastTime; 58 | 59 | min = Mathf.Min(0.1f, min); 60 | 61 | DeltaTime = min; 62 | _lastTime = time; 63 | FrameCount++; 64 | 65 | if (FrameCount == long.MaxValue - 1) FrameCount = 1; 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_SimulationMode: 0 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Receiver/ShockwaveReceiverNode.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UniAquarium.Aquarium.Actors; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | using UnityEngine; 6 | 7 | namespace UniAquarium.Aquarium.Nodes 8 | { 9 | internal sealed class ShockwaveReceiverNode : ReceiverNode 10 | { 11 | private readonly float _avoidDistance; 12 | private readonly float _triggerDistance; 13 | private ShockwaveSpawnerNode _shockwaveSpawner; 14 | 15 | public ShockwaveReceiverNode(float triggerDistance = 40f, float avoidDistance = 80f) 16 | { 17 | _triggerDistance = triggerDistance; 18 | _avoidDistance = avoidDistance; 19 | } 20 | 21 | protected override TargetTrackingReceivedData UpdateReceived() 22 | { 23 | if (_shockwaveSpawner == null) 24 | { 25 | var shockwaveSpawner = SceneOption.Utility.GetActor(); 26 | _shockwaveSpawner = shockwaveSpawner?.GetNode() as ShockwaveSpawnerNode; 27 | 28 | if (_shockwaveSpawner == null) 29 | return null; 30 | } 31 | 32 | var shockwave = _shockwaveSpawner.Actors.FirstOrDefault(x => 33 | Vector2.Distance(x.Position, Transform.Position) < _triggerDistance); 34 | 35 | if (shockwave == null) 36 | return null; 37 | 38 | var vector = (shockwave.Position - Transform.Position).normalized; 39 | var toX = Transform.Position.x - vector.x * _avoidDistance * Random.Range(0f, 1f); 40 | var toY = Transform.Position.y - vector.y * _avoidDistance * Random.Range(0f, 1f); 41 | var to = new Vector2(toX, toY); 42 | 43 | var targetSpeed = Random.Range(6f, 10f); 44 | var lastSpeed = Mathf.Lerp(200f, 300f, Random.Range(0f, 1f)); 45 | 46 | var data = new TargetTrackingReceivedData 47 | { 48 | TargetPosition = to, 49 | Speed = targetSpeed, 50 | OnArrived = () => Transform.Velocity = Transform.Velocity.normalized * lastSpeed 51 | }; 52 | 53 | return data; 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /Third Party Notices.md: -------------------------------------------------------------------------------- 1 | https://github.com/le-nn/vscode-vector-aquarium 2 | 3 | Copyright 2022 le-nn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | 11 | --------- 12 | https://github.com/breadnone/EditorDeltaTime 13 | 14 | MIT License 15 | 16 | Copyright (c) 2024 Cattywampus 17 | 18 | Permission is hereby granted, free of charge, to any person obtaining a copy 19 | of this software and associated documentation files (the "Software"), to deal 20 | in the Software without restriction, including without limitation the rights 21 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 22 | copies of the Software, and to permit persons to whom the Software is 23 | furnished to do so, subject to the following conditions: 24 | 25 | The above copyright notice and this permission notice shall be included in all 26 | copies or substantial portions of the Software. 27 | 28 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 29 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 30 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 31 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 32 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 33 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 34 | SOFTWARE. -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Paints/Actors/Actor.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using UnityEngine.UIElements; 4 | 5 | namespace UniAquarium.Core.Paints 6 | { 7 | public abstract class Actor : IActor, IPressable where T : ISceneOption 8 | { 9 | private readonly List _nodes = new(); 10 | 11 | public Actor(T sceneOption) 12 | { 13 | SceneOption = sceneOption; 14 | IsDestroyed = false; 15 | } 16 | 17 | protected T SceneOption { get; } 18 | 19 | public void Destroy() 20 | { 21 | IsDestroyed = true; 22 | } 23 | 24 | public bool IsDestroyed { get; private set; } 25 | 26 | 27 | public void Instantiate(Vector2? location, float angle = 0, float scale = 1) 28 | { 29 | SceneOption.Utility.Instantiate(this, location, angle, scale); 30 | } 31 | 32 | public virtual void Draw(Painter2D painter, float deltaTime) 33 | { 34 | foreach (var node in _nodes) node.Draw(painter, deltaTime); 35 | } 36 | 37 | public virtual void Update(float deltaTime) 38 | { 39 | foreach (var node in _nodes) node.Update(deltaTime); 40 | } 41 | 42 | public Vector2 Position { get; set; } 43 | public Vector2 Velocity { get; set; } 44 | public float Rotation { get; set; } 45 | public float Scale { get; set; } 46 | 47 | public virtual void Initialize() 48 | { 49 | foreach (var node in _nodes) node.Initialize(this, SceneOption); 50 | } 51 | 52 | public TNode GetNode() where TNode : INode 53 | { 54 | foreach (var node in _nodes) 55 | if (node is TNode t) 56 | return t; 57 | 58 | return default; 59 | } 60 | 61 | public void Press(MouseDownEvent evt) 62 | { 63 | foreach (var node in _nodes) 64 | if (node is IPressable pressable) 65 | pressable.Press(evt); 66 | } 67 | 68 | 69 | protected void AddNode(INode node) 70 | { 71 | _nodes.Add(node); 72 | } 73 | 74 | protected void AddNodes(IEnumerable nodes) 75 | { 76 | _nodes.AddRange(nodes); 77 | } 78 | 79 | protected void RemoveNode(INode node) 80 | { 81 | _nodes.Remove(node); 82 | } 83 | } 84 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/AquariumComponent.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Aquarium.Actors; 2 | using UniAquarium.Aquarium.Nodes; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Components; 5 | using UniAquarium.Foundation; 6 | using UnityEngine; 7 | 8 | namespace UniAquarium.Aquarium 9 | { 10 | public class AquariumComponent : CanvasSceneComponent 11 | { 12 | public AquariumComponent(bool interactive = true) : base(interactive) 13 | { 14 | } 15 | 16 | protected override float DeltaTime => EditorDeltaTime.DeltaTime * SceneOption.TimeScale; 17 | 18 | protected override void Initialize(AquariumSceneOption sceneOption) 19 | { 20 | var settings = UniAquariumSettings.Instance.AquariumSetting; 21 | 22 | if (settings.CanFeed) new FoodSpawner(sceneOption).Instantiate(Vector2.zero); 23 | if (settings.CanClean) new ShockwaveSpawner(sceneOption).Instantiate(Vector2.zero); 24 | 25 | foreach (var fishGroupSettings in settings.FishGroupSettings) 26 | { 27 | var fishSettings = fishGroupSettings.FishSettings; 28 | 29 | if (fishSettings.Length == 0) continue; 30 | if (fishSettings.Length == 1) 31 | { 32 | FishFactory.Create(fishSettings[0], sceneOption).Instantiate(fishSettings[0].Location, 33 | fishSettings[0].Angle, fishSettings[0].Scale); 34 | } 35 | else 36 | { 37 | var boid = new Boid(sceneOption); 38 | boid.Instantiate(Vector2.zero); 39 | foreach (var fishSetting in fishSettings) 40 | { 41 | var fish = FishFactory.Create(fishSetting, sceneOption); 42 | fish.Instantiate(fishSetting.Location, fishSetting.Angle, fishSetting.Scale); 43 | boid.AddTrackingNode(fish.GetNode()); 44 | } 45 | } 46 | } 47 | } 48 | 49 | protected override AquariumScene CreateScene() 50 | { 51 | return new AquariumScene(); 52 | } 53 | 54 | protected override AquariumSceneOption CreateSceneOption(AquariumScene scene) 55 | { 56 | var width = resolvedStyle.width; 57 | var height = resolvedStyle.height; 58 | return new AquariumSceneOption(width, height, scene); 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_VideoShadersIncludeMode: 2 32 | m_AlwaysIncludedShaders: 33 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 39 | - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} 40 | m_PreloadedShaders: [] 41 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} 42 | m_CustomRenderPipeline: {fileID: 0} 43 | m_TransparencySortMode: 0 44 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 45 | m_DefaultRenderingPath: 1 46 | m_DefaultMobileRenderingPath: 1 47 | m_TierSettings: [] 48 | m_LightmapStripping: 0 49 | m_FogStripping: 0 50 | m_InstancingStripping: 0 51 | m_LightmapKeepPlain: 1 52 | m_LightmapKeepDirCombined: 1 53 | m_LightmapKeepDynamicPlain: 1 54 | m_LightmapKeepDynamicDirCombined: 1 55 | m_LightmapKeepShadowMask: 1 56 | m_LightmapKeepSubtractive: 1 57 | m_FogKeepLinear: 1 58 | m_FogKeepExp: 1 59 | m_FogKeepExp2: 1 60 | m_AlbedoSwatchInfos: [] 61 | m_LightsUseLinearIntensity: 0 62 | m_LightsUseColorTemperature: 0 63 | m_DefaultRenderingLayerMask: 1 64 | m_LogWhenShaderIsCompiled: 0 65 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Receiver/FoodReceiverNode.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UniAquarium.Aquarium.Actors; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | using UnityEngine; 6 | 7 | namespace UniAquarium.Aquarium.Nodes 8 | { 9 | internal sealed class FoodReceiverNode : ReceiverNode 10 | { 11 | private readonly float _speed; 12 | private readonly float _triggerAngle; 13 | private readonly float _triggerDistance; 14 | private FoodSpawnerNode _foodSpawner; 15 | 16 | public FoodReceiverNode(float triggerDistance = 200f, float triggerAngle = 160f, float speed = 3f) 17 | { 18 | _triggerDistance = triggerDistance; 19 | _triggerAngle = triggerAngle; 20 | _speed = speed; 21 | } 22 | 23 | protected override TargetTrackingReceivedData UpdateReceived() 24 | { 25 | if (_foodSpawner == null) 26 | { 27 | var foodSpawner = SceneOption.Utility.GetActor(); 28 | _foodSpawner = foodSpawner?.GetNode() as FoodSpawnerNode; 29 | 30 | if (_foodSpawner == null) 31 | return null; 32 | } 33 | 34 | 35 | var filteredFoods = _foodSpawner.Actors.Where(t => Equals(t.TargetNode, this) || t.TargetNode == null) 36 | .ToList(); 37 | 38 | if (filteredFoods.Count == 0) 39 | return null; 40 | 41 | 42 | var food = filteredFoods[0]; 43 | foreach (var t in filteredFoods.Where(t => Vector2.Distance(Transform.Position, t.Position) < 44 | Vector2.Distance(Transform.Position, food.Position))) 45 | food = t; 46 | 47 | if (Vector2.Distance(Transform.Position, food.Position) > _triggerDistance) 48 | return null; 49 | 50 | var angleDiff = Mathf.Atan2(food.Position.y - Transform.Position.y, food.Position.x - Transform.Position.x); 51 | var selfAngle = Mathf.Atan2(Transform.Velocity.y, Transform.Velocity.x); 52 | 53 | if (!(Mathf.Abs(selfAngle - angleDiff) < _triggerAngle * Mathf.Deg2Rad)) return null; 54 | food.TargetNode = this; 55 | 56 | var data = new TargetTrackingReceivedData 57 | { 58 | TargetPosition = food.Position, 59 | Speed = _speed, 60 | OnArrived = () => food.Destroy() 61 | }; 62 | 63 | return data; 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Core/Components/CanvasSceneComponent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UniAquarium.Core.Paints; 3 | using UnityEditor; 4 | using UnityEngine.UIElements; 5 | 6 | namespace UniAquarium.Core.Components 7 | { 8 | public abstract class CanvasSceneComponent : VisualElement, IDisposable 9 | where T : CanvasScene where TOption : ISceneOption where TActor : IActor 10 | { 11 | private readonly bool _interactive; 12 | private T _scene; 13 | public TOption SceneOption; 14 | 15 | protected CanvasSceneComponent(bool interactive = true) 16 | { 17 | _interactive = interactive; 18 | 19 | style.height = Length.Percent(100f); 20 | style.width = Length.Percent(100f); 21 | } 22 | 23 | protected abstract float DeltaTime { get; } 24 | 25 | public void Dispose() 26 | { 27 | Disable(); 28 | } 29 | 30 | public virtual void Enable() 31 | { 32 | generateVisualContent -= OnGenerateVisualContent; 33 | generateVisualContent += OnGenerateVisualContent; 34 | 35 | EditorApplication.update -= Update; 36 | EditorApplication.update += Update; 37 | 38 | if (_interactive) 39 | RegisterCallback(OnMouseDown); 40 | else 41 | pickingMode = PickingMode.Ignore; 42 | } 43 | 44 | public virtual void Disable() 45 | { 46 | generateVisualContent -= OnGenerateVisualContent; 47 | EditorApplication.update -= Update; 48 | 49 | if (_interactive) 50 | UnregisterCallback(OnMouseDown); 51 | } 52 | 53 | public virtual void Update() 54 | { 55 | _scene?.Update(DeltaTime); 56 | MarkDirtyRepaint(); 57 | } 58 | 59 | protected abstract void Initialize(TOption sceneOption); 60 | protected abstract T CreateScene(); 61 | protected abstract TOption CreateSceneOption(T scene); 62 | 63 | private void OnGenerateVisualContent(MeshGenerationContext context) 64 | { 65 | var painter = context.painter2D; 66 | 67 | if (_scene == null) 68 | { 69 | _scene = CreateScene(); 70 | SceneOption = CreateSceneOption(_scene); 71 | Initialize(SceneOption); 72 | } 73 | 74 | _scene?.Draw(painter, DeltaTime); 75 | } 76 | 77 | private void OnMouseDown(MouseDownEvent evt) 78 | { 79 | _scene?.Press(evt); 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/BranchShape.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UniAquarium.Core.Paints; 3 | using UniAquarium.Foundation; 4 | using UnityEngine; 5 | using UnityEngine.UIElements; 6 | using ITransform = UniAquarium.Core.Paints.ITransform; 7 | using Random = UnityEngine.Random; 8 | 9 | namespace UniAquarium.Aquarium.Nodes 10 | { 11 | internal sealed class BranchShape : Shape 12 | { 13 | private readonly float _angle; 14 | private readonly Color _color; 15 | private readonly int _maxSegmentPointSize; 16 | private readonly float[] _pointFlickingSpeeds; 17 | 18 | private readonly float[] _points; 19 | private readonly int _segmentLength; 20 | private readonly int _segments; 21 | 22 | private readonly float _speed; 23 | private float _wave; 24 | private float _wave2; 25 | 26 | public BranchShape(Color color, float angle, float speed) 27 | { 28 | _color = color; 29 | _angle = angle; 30 | _speed = speed; 31 | 32 | _wave = 0; 33 | _wave2 = Random.Range(0f, 1000f); 34 | _segments = Random.Range(3, 10); 35 | _segmentLength = Random.Range(50, 70); 36 | _maxSegmentPointSize = Random.Range(5, 10); 37 | 38 | _points = new float[_segments].Select(x => Random.Range(0f, _segments) + Random.Range(0f, 1f)).ToArray(); 39 | _pointFlickingSpeeds = new float[_segments].Select(x => Random.Range(5f, 10f)).ToArray(); 40 | } 41 | 42 | 43 | public override void Draw(Painter2D painter, ITransform transform, float deltaTime) 44 | { 45 | var bgc = new Color(_color.r, _color.g, _color.b, 0.12f); 46 | var pc = new Color(_color.r, _color.g, _color.b, 0.48f); 47 | var pc2 = new Color(_color.r, _color.g, _color.b, 0.09f); 48 | 49 | using (var painterScope = new Painter2DScope(painter)) 50 | { 51 | painterScope.Translate(transform.Position); 52 | painterScope.Rotate(_angle * Mathf.Deg2Rad); 53 | 54 | for (var i = 0; i < _segments; i++) 55 | { 56 | var theta = Mathf.Sin(_wave2) * 0.1f + Mathf.Sin(_wave) * 2f + Rand(); 57 | var to = Mathf.Lerp(_segmentLength, _segmentLength * 0.5f, (float)i / _segments); 58 | 59 | _points[i] += _pointFlickingSpeeds[i] * deltaTime; 60 | var width = Mathf.Abs(Mathf.Sin(_points[i])) * _maxSegmentPointSize; 61 | 62 | painterScope.Rotate(theta * Mathf.Deg2Rad); 63 | painterScope.DrawLine(Vector2.zero, new Vector2(0, to), width, bgc); 64 | painterScope.FillCircle(Vector2.zero, width * 0.6f, pc); 65 | painterScope.FillCircle(Vector2.zero, width * 2f, pc2); 66 | painterScope.Translate(new Vector2(0, to)); 67 | 68 | _wave += _speed * 0.02f; 69 | _wave2 += _speed * 0.002f * deltaTime; 70 | } 71 | 72 | var radius = Mathf.Abs(Mathf.Sin(_points[0])) * _maxSegmentPointSize; 73 | painterScope.FillCircle(Vector2.zero, radius * 0.3f, pc); 74 | painterScope.FillCircle(Vector2.zero, radius * 1f, pc2); 75 | _wave += _speed * deltaTime * 0.03f; 76 | } 77 | 78 | return; 79 | 80 | float Rand() 81 | { 82 | return Random.Range(0f, 1f) * 0.001f * (Random.Range(0, 1) == 0 ? -1 : 1); 83 | } 84 | } 85 | } 86 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Painter2D/Painter2DExtension.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.UIElements; 3 | 4 | namespace UniAquarium.Foundation 5 | { 6 | internal static class Painter2DExtension 7 | { 8 | public static void MoveTo(this Painter2D painter, float x, float y) 9 | { 10 | var moveTo = new Vector2(x, y); 11 | painter.MoveTo(moveTo); 12 | } 13 | 14 | public static void LineTo(this Painter2D painter, float x, float y) 15 | { 16 | var lineTo = new Vector2(x, y); 17 | painter.LineTo(lineTo); 18 | } 19 | 20 | public static void QuadraticCurveTo(this Painter2D painter, float x1, float y1, float x2, float y2) 21 | { 22 | var quadraticCurveTo1 = new Vector2(x1, y1); 23 | var quadraticCurveTo2 = new Vector2(x2, y2); 24 | painter.QuadraticCurveTo(quadraticCurveTo1, quadraticCurveTo2); 25 | } 26 | 27 | public static void BezierCurveTo(this Painter2D painter, float x1, float y1, float x2, float y2, float x3, 28 | float y3) 29 | { 30 | var bezierCurveTo1 = new Vector2(x1, y1); 31 | var bezierCurveTo2 = new Vector2(x2, y2); 32 | var bezierCurveTo3 = new Vector2(x3, y3); 33 | painter.BezierCurveTo(bezierCurveTo1, bezierCurveTo2, bezierCurveTo3); 34 | } 35 | 36 | public static void FillRect(this Painter2D painter, float x, float y, float width, float height) 37 | { 38 | painter.BeginPath(); 39 | painter.MoveTo(x, y); 40 | painter.LineTo(x + width, y); 41 | painter.LineTo(x + width, y + height); 42 | painter.LineTo(x, y + height); 43 | painter.ClosePath(); 44 | painter.Fill(); 45 | } 46 | 47 | public static void DrawLine(this Painter2D painter, float x1, float y1, float x2, float y2) 48 | { 49 | painter.BeginPath(); 50 | painter.MoveTo(x1, y1); 51 | painter.LineTo(x2, y2); 52 | painter.ClosePath(); 53 | painter.Stroke(); 54 | } 55 | 56 | public static void DrawLine(this Painter2D painter, float x1, float y1, float x2, float y2, float width, 57 | Color color) 58 | { 59 | painter.lineWidth = width; 60 | painter.strokeColor = color; 61 | painter.DrawLine(x1, y1, x2, y2); 62 | } 63 | 64 | public static void FillCircle(this Painter2D painter, float x, float y, float radius) 65 | { 66 | var center = new Vector2(x, y); 67 | 68 | painter.BeginPath(); 69 | painter.Arc(center, radius, 0, Angle.Degrees(360)); 70 | painter.ClosePath(); 71 | painter.Fill(); 72 | } 73 | 74 | public static void FillCircle(this Painter2D painter, float x, float y, float radius, Color color) 75 | { 76 | painter.fillColor = color; 77 | painter.FillCircle(x, y, radius); 78 | } 79 | 80 | 81 | public static void DrawCircle(this Painter2D painter, float x, float y, float radius) 82 | { 83 | var center = new Vector2(x, y); 84 | 85 | painter.BeginPath(); 86 | painter.Arc(center, radius, 0, Angle.Degrees(360)); 87 | painter.ClosePath(); 88 | painter.Stroke(); 89 | } 90 | 91 | public static void DrawCircle(this Painter2D painter, float x, float y, float radius, float width, Color color) 92 | { 93 | painter.lineWidth = width; 94 | painter.strokeColor = color; 95 | painter.DrawCircle(x, y, radius); 96 | } 97 | } 98 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/FishShape.cs: -------------------------------------------------------------------------------- 1 | using UniAquarium.Core.Paints; 2 | using UniAquarium.Foundation; 3 | using UnityEngine; 4 | using UnityEngine.UIElements; 5 | using ITransform = UniAquarium.Core.Paints.ITransform; 6 | using Random = UnityEngine.Random; 7 | 8 | namespace UniAquarium.Aquarium.Nodes 9 | { 10 | internal sealed class FishShape : Shape 11 | { 12 | private const float SizeBias = 0.3f; 13 | private const float SegLength = 14f; 14 | private readonly Color _color; 15 | 16 | 17 | private readonly Vector2[] _segments = new Vector2[10]; 18 | 19 | private float _lastAngle; 20 | private float _lastDirection = 30; 21 | 22 | public FishShape(Color? color = null) 23 | { 24 | _color = color ?? Random.ColorHSV(); 25 | 26 | for (var i = 0; i < _segments.Length; i++) _segments[i] = new Vector2(0, 0); 27 | } 28 | 29 | public override void Draw(Painter2D painter, ITransform transform, float deltaTime) 30 | { 31 | DrawSegment(painter, 0, transform.Position.x, transform.Position.y, transform.Scale, deltaTime); 32 | for (var i = 0; i < 8; i++) 33 | DrawSegment(painter, i + 1, _segments[i].x, _segments[i].y, transform.Scale, deltaTime); 34 | } 35 | 36 | private void DrawSegment(Painter2D painter, int number, float x, float y, float scale, float deltaTime) 37 | { 38 | var size = scale * SizeBias; 39 | var dx = x - _segments[number].x; 40 | var dy = y - _segments[number].y; 41 | var angle = Mathf.Atan2(dy, dx); 42 | 43 | var x2 = x - Mathf.Cos(angle) * SegLength * size; 44 | var y2 = y - Mathf.Sin(angle) * SegLength * size; 45 | _segments[number] = new Vector2(x2, y2); 46 | 47 | painter.fillColor = _color; 48 | painter.strokeColor = _color; 49 | 50 | if (number == 1) 51 | { 52 | _lastAngle = Mathf.Lerp(_lastAngle, _lastDirection, 0.4f) * deltaTime; 53 | _lastDirection = _lastAngle switch 54 | { 55 | >= 13 => 0, 56 | <= 2 => 15, 57 | _ => _lastDirection 58 | }; 59 | 60 | foreach (var sign in new[] { -1, 1 }) 61 | { 62 | painter.lineWidth = 3 * size; 63 | painter.DrawLine( 64 | x + Mathf.Cos(angle + 120f * sign * Mathf.Deg2Rad) * 10 * size, 65 | y + Mathf.Sin(angle + 120f * sign * Mathf.Deg2Rad) * 10 * size, 66 | x + Mathf.Cos(angle + (145f + _lastAngle) * sign * Mathf.Deg2Rad) * 45 * size, 67 | y + Mathf.Sin(angle + (145f + _lastAngle) * sign * Mathf.Deg2Rad) * 45 * size 68 | ); 69 | 70 | painter.FillCircle( 71 | x + Mathf.Cos(angle + (145f + _lastAngle) * sign * Mathf.Deg2Rad) * 45 * size, 72 | y + Mathf.Sin(angle + (145f + _lastAngle) * sign * Mathf.Deg2Rad) * 45 * size, 73 | 4 * size 74 | ); 75 | } 76 | 77 | painter.FillCircle( 78 | _segments[number].x, 79 | _segments[number].y, 80 | (10 - number) * 1.2f * size 81 | ); 82 | } 83 | 84 | else if (number % 2 == 1) 85 | { 86 | painter.FillCircle( 87 | _segments[number].x, 88 | _segments[number].y, 89 | 1.5f * size 90 | ); 91 | 92 | painter.lineWidth = 1; 93 | painter.DrawCircle( 94 | _segments[number].x, 95 | _segments[number].y, 96 | (10 - number) * 1.2f * size 97 | ); 98 | } 99 | else 100 | { 101 | painter.FillCircle( 102 | _segments[number].x, 103 | _segments[number].y, 104 | (10 - number) * 0.5f * size); 105 | } 106 | } 107 | } 108 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Mover/BoidNode.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Aquarium.Scene; 3 | using UniAquarium.Core.Paints; 4 | using UniAquarium.Foundation; 5 | using UnityEngine; 6 | using UnityEngine.UIElements; 7 | 8 | namespace UniAquarium.Aquarium.Nodes 9 | { 10 | internal sealed class BoidNode : Node 11 | { 12 | // 群れの平均速度に合わせる度合い 13 | private readonly float _alignment; 14 | 15 | private readonly float _avoidThresholdDistance; 16 | 17 | // 群れの中心に向かう度合い 18 | private readonly float _cohesion; 19 | 20 | // 仲間を避ける度合い 21 | private readonly float _separation; 22 | private readonly List _trackingNodes = new(); 23 | 24 | public BoidNode(float cohesion = 8f, float separation = 16f, float alignment = 2f, 25 | float avoidThresholdDistance = 30f) 26 | { 27 | _cohesion = cohesion; 28 | _separation = separation; 29 | _alignment = alignment; 30 | _avoidThresholdDistance = avoidThresholdDistance; 31 | } 32 | 33 | public override void Draw(Painter2D painter, float deltaTime) 34 | { 35 | if (SceneOption.IsDebug) 36 | { 37 | painter.fillColor = new Color(1f, 0f, 0f, 0.3f); 38 | painter.FillCircle(Transform.Position.x, Transform.Position.y, 5f); 39 | } 40 | } 41 | 42 | public override void Update(float deltaTime) 43 | { 44 | foreach (var trackingNode in _trackingNodes) 45 | { 46 | var moveVector = GetMovementVector(trackingNode); 47 | var distance = Vector2.Distance(trackingNode.Transform.Position, 48 | trackingNode.HasTarget ? moveVector + trackingNode.TargetPosition : moveVector); 49 | trackingNode.TranslateTargetPosition(moveVector, distance); 50 | } 51 | } 52 | 53 | private Vector2 GetMovementVector(TargetTrackingNode trackingNode) 54 | { 55 | var vector = Vector2.zero; 56 | 57 | CalculateVectorToCenter(trackingNode, ref vector); 58 | CalculateVectorToAvoid(trackingNode, ref vector); 59 | CalculateVectorToAlign(trackingNode, ref vector); 60 | 61 | return vector; 62 | } 63 | 64 | private void CalculateVectorToCenter(TargetTrackingNode trackingNode, ref Vector2 result) 65 | { 66 | var vector = Vector2.zero; 67 | var position = trackingNode.Transform.Position; 68 | 69 | foreach (var node in _trackingNodes) 70 | { 71 | if (node.Equals(trackingNode)) continue; 72 | vector += node.Transform.Position; 73 | } 74 | 75 | vector /= _trackingNodes.Count - 1; 76 | vector += Transform.Position; 77 | vector /= 2; 78 | 79 | result = (vector - position).normalized; 80 | result *= _cohesion; 81 | } 82 | 83 | private void CalculateVectorToAvoid(TargetTrackingNode trackingNode, ref Vector2 result) 84 | { 85 | var vector = Vector2.zero; 86 | foreach (var node in _trackingNodes) 87 | { 88 | if (node.Equals(trackingNode)) continue; 89 | if (Vector2.Distance(node.Transform.Position, trackingNode.Transform.Position) < 90 | _avoidThresholdDistance) 91 | vector -= node.Transform.Position - trackingNode.Transform.Position; 92 | } 93 | 94 | if (Vector2.Distance(Transform.Position, trackingNode.Transform.Position) < 95 | _avoidThresholdDistance) 96 | vector -= Transform.Position - trackingNode.Transform.Position; 97 | 98 | result += vector.normalized; 99 | result *= _separation; 100 | } 101 | 102 | private void CalculateVectorToAlign(TargetTrackingNode trackingNode, ref Vector2 result) 103 | { 104 | var vector = Vector2.zero; 105 | foreach (var node in _trackingNodes) 106 | { 107 | if (node.Equals(trackingNode)) continue; 108 | vector += node.Transform.Velocity; 109 | } 110 | 111 | vector += Transform.Velocity; 112 | vector /= _trackingNodes.Count; 113 | 114 | result += vector.normalized; 115 | result *= _alignment; 116 | } 117 | 118 | public void AddTrackingNode(TargetTrackingNode targetTrackingNode) 119 | { 120 | _trackingNodes.Add(targetTrackingNode); 121 | targetTrackingNode.AutoTarget = false; 122 | } 123 | } 124 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UniAquarium 2 | 3 | Create your aquarium in Unity Editor. 4 | 5 | The aquarium component is provided using Painter2D, which allows HtmlCanvas-like drawing. 6 | 7 | ![1a3ce99dbad557ae2e9e3f61f785d4b7](https://github.com/Garume/UniAquarium/assets/80187947/77a5f4fa-c0a1-4a40-b9eb-944358e115d3) 8 | 9 | [![license](https://img.shields.io/badge/LICENSE-MIT-green.svg)](LICENSE) 10 | 11 | It is developed with reference to https://github.com/le-nn/vscode-vector-aquarium 12 | 13 | ## Setup 14 | 15 | ### Requitements 16 | 17 | * Unity 2022.1 or later 18 | 19 | ### Installation 20 | 21 | 1. Open Package Manager from Window > Package Manager. 22 | 2. Click the "+" button > Add package from git URL. 23 | 3. Enter the following URL: 24 | 25 | ``` 26 | https://github.com/Garume/UniAquarium.git?path=/Assets/UniAquarium 27 | ``` 28 | ### How to open an aquarium 29 | 30 | Press `Window > Aquarium` from the toolbar to open the aquarium window. 31 | 32 | ## Feature 33 | 34 | * When tapped, bait appears and fish will chase and eat it. 35 | * When fish tapped, fish will diffuse and escape. 36 | * Other fish will swim. 37 | * Grouped fish swim in swarm. 38 | * You can make your own fish. 39 | 40 | ## Usage 41 | 42 | ### Can Feed 43 | Click anywhere on the window and the bait will appear. 44 | 45 | The fish will eat this bait. 46 | 47 | ![6cc0eade3a232596be1dc028a2d34e78](https://github.com/Garume/UniAquarium/assets/80187947/2817c007-d9ca-48fd-9cff-f0a799076205) 48 | 49 | ### Can Clean 50 | 51 | Click anywhere on the window to generate a shockwave. 52 | 53 | The fish will run away from this shockwave. 54 | 55 | ![756f394d0574921db130b7615f0cd055](https://github.com/Garume/UniAquarium/assets/80187947/d9163214-1d7b-4977-88f8-a359bef7a861) 56 | 57 | ### Custom Settings 58 | You can create Scriptable Objects for custom settings. 59 | 60 | UniAquariumSettings from Assets > Create > UniAquarium Settings. 61 | 62 | ![a8b2fd80d8bc89cb5d27a8791be0b4bd](https://github.com/Garume/UniAquarium/assets/80187947/78590bb9-9088-4067-a2aa-89cae0e65297) 63 | 64 | Reload window after making any changes to the settings. 65 | 66 | The Aquarium window has a reload function. 67 | 68 | `3-point reader > Reload` 69 | 70 | ![409c10bd298d7723b2fe670bcc0dc503](https://github.com/Garume/UniAquarium/assets/80187947/a40071aa-127d-4c57-86bd-683c702937e4) 71 | 72 | ### Aquarium Component 73 | 74 | Components extending from VisualElement are available to draw aquariums in addition to windows. 75 | 76 | By adding this component to any container, you can easily draw an aquarium. 77 | 78 | Let's try drawing the aquarium in the Scene Hierarchy Window. 79 | 80 | ```cs 81 | using System.Reflection; 82 | using UniAquarium.Aquarium; 83 | using UnityEditor; 84 | using UnityEngine.UIElements; 85 | 86 | [InitializeOnLoad] 87 | public class HierarchyWindowHook 88 | { 89 | private static VisualElement _rootVisualElement; 90 | 91 | static HierarchyWindowHook() 92 | { 93 | EditorApplication.update += Update; 94 | } 95 | 96 | private static void Update() 97 | { 98 | if (_rootVisualElement != null) return; 99 | 100 | // get SceneHierarchyWindow. 101 | var hierarchyWindowType = typeof(Editor).Assembly.GetType("UnityEditor.SceneHierarchyWindow"); 102 | var hierarchyWindow = EditorWindow.GetWindow(hierarchyWindowType); 103 | 104 | // get VisualElement using reflection. 105 | if (hierarchyWindow == null) return; 106 | var fieldInfo = hierarchyWindowType.GetField("m_SceneHierarchy", 107 | BindingFlags.NonPublic | BindingFlags.Instance); 108 | if (fieldInfo == null) return; 109 | var sceneHierarchy = fieldInfo.GetValue(hierarchyWindow); 110 | var sceneHierarchyType = sceneHierarchy.GetType(); 111 | var visualElementFieldInfo = sceneHierarchyType.GetField("m_EditorWindow", 112 | BindingFlags.NonPublic | BindingFlags.Instance); 113 | if (visualElementFieldInfo == null) return; 114 | 115 | var treeView = visualElementFieldInfo.GetValue(sceneHierarchy); 116 | var root = treeView as EditorWindow; 117 | 118 | _rootVisualElement = root.rootVisualElement; 119 | 120 | // Setting it to false disables clicks and other actions. 121 | var aquariumComponent = new AquariumComponent(false); 122 | _rootVisualElement.Add(aquariumComponent); 123 | aquariumComponent.Enable(); 124 | } 125 | } 126 | ``` 127 | 128 | Write it in any file and save it. 129 | Then, look at the Scene Hierarchy Window. 130 | 131 | ![974dc08edc6087847922347b928b8745](https://github.com/Garume/UniAquarium/assets/80187947/ed2b4591-a2f3-45a3-8ff5-110d8068307c) 132 | 133 | So Nice! 134 | 135 | ## License 136 | [MIT License](LICENSE) 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Foundation/Painter2D/Painter2DScope.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using UnityEngine.UIElements; 4 | 5 | namespace UniAquarium.Foundation 6 | { 7 | internal sealed class Painter2DScope : IDisposable 8 | { 9 | private readonly Color _originalFillColor; 10 | private readonly LineCap _originalLineCap; 11 | private readonly LineJoin _originalLineJoin; 12 | private readonly float _originalLineWidth; 13 | private readonly float _originalMiterLimit; 14 | private readonly Color _originalStrokeColor; 15 | private readonly Gradient _originalStrokeGradient; 16 | private readonly Painter2D _painter2D; 17 | private Vector2 _position; 18 | private float _rotation; 19 | 20 | public Painter2DScope(Painter2D painter2D) 21 | { 22 | _painter2D = painter2D; 23 | _originalFillColor = painter2D.fillColor; 24 | _originalLineCap = painter2D.lineCap; 25 | _originalLineJoin = painter2D.lineJoin; 26 | _originalLineWidth = painter2D.lineWidth; 27 | _originalMiterLimit = painter2D.miterLimit; 28 | _originalStrokeColor = painter2D.strokeColor; 29 | _originalStrokeGradient = painter2D.strokeGradient; 30 | } 31 | 32 | public Color FillColor 33 | { 34 | set => _painter2D.fillColor = value; 35 | } 36 | 37 | public Color StrokeColor 38 | { 39 | set => _painter2D.strokeColor = value; 40 | } 41 | 42 | public Gradient StrokeGradient 43 | { 44 | set => _painter2D.strokeGradient = value; 45 | } 46 | 47 | public float LineWidth 48 | { 49 | set => _painter2D.lineWidth = value; 50 | } 51 | 52 | public LineCap LineCap 53 | { 54 | set => _painter2D.lineCap = value; 55 | } 56 | 57 | public LineJoin LineJoin 58 | { 59 | set => _painter2D.lineJoin = value; 60 | } 61 | 62 | public float MiterLimit 63 | { 64 | set => _painter2D.miterLimit = value; 65 | } 66 | 67 | public void Dispose() 68 | { 69 | if (_painter2D == null) return; 70 | 71 | _painter2D.fillColor = _originalFillColor; 72 | _painter2D.lineCap = _originalLineCap; 73 | _painter2D.lineJoin = _originalLineJoin; 74 | _painter2D.lineWidth = _originalLineWidth; 75 | _painter2D.miterLimit = _originalMiterLimit; 76 | _painter2D.strokeColor = _originalStrokeColor; 77 | _painter2D.strokeGradient = _originalStrokeGradient; 78 | } 79 | 80 | public void Rotate(float value) 81 | { 82 | _rotation += value; 83 | } 84 | 85 | public void Translate(Vector2 value) 86 | { 87 | _position = Transform(value); 88 | } 89 | 90 | public void BeginPath() 91 | { 92 | _painter2D?.BeginPath(); 93 | } 94 | 95 | public void MoveTo(Vector2 position) 96 | { 97 | _painter2D?.MoveTo(Transform(position)); 98 | } 99 | 100 | public void LineTo(Vector2 position) 101 | { 102 | _painter2D?.LineTo(Transform(position)); 103 | } 104 | 105 | public void ClosePath() 106 | { 107 | _painter2D?.ClosePath(); 108 | } 109 | 110 | public void Fill() 111 | { 112 | _painter2D?.Fill(); 113 | } 114 | 115 | public void DrawLine(Vector2 from, Vector2 to, float width, Color color) 116 | { 117 | var transformedFrom = Transform(from); 118 | var transformedTo = Transform(to); 119 | _painter2D?.DrawLine(transformedFrom.x, transformedFrom.y, transformedTo.x, transformedTo.y, width, color); 120 | } 121 | 122 | public void DrawCircle(Vector2 position, float radius, float width, Color color) 123 | { 124 | var transformedPosition = Transform(position); 125 | 126 | _painter2D?.DrawCircle(transformedPosition.x, transformedPosition.y, radius, width, color); 127 | } 128 | 129 | public void FillCircle(Vector2 position, float radius, Color color) 130 | { 131 | var transformedPosition = Transform(position); 132 | _painter2D?.FillCircle(transformedPosition.x, transformedPosition.y, radius, color); 133 | } 134 | 135 | 136 | private Vector2 Transform(Vector2 position) 137 | { 138 | var cos = Mathf.Cos(_rotation); 139 | var sin = Mathf.Sin(_rotation); 140 | 141 | var rotatedX = cos * position.x - sin * position.y; 142 | var rotatedY = sin * position.x + cos * position.y; 143 | 144 | return new Vector2(rotatedX, rotatedY) + _position; 145 | } 146 | } 147 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Mover/TargetTrackingNode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UniAquarium.Aquarium.Scene; 4 | using UniAquarium.Core.Paints; 5 | using UniAquarium.Foundation; 6 | using UnityEngine; 7 | using UnityEngine.UIElements; 8 | using Random = UnityEngine.Random; 9 | 10 | namespace UniAquarium.Aquarium.Nodes 11 | { 12 | internal class TargetTrackingReceivedData 13 | { 14 | public Action OnArrived; 15 | public float Speed; 16 | public Vector2 TargetPosition; 17 | } 18 | 19 | internal sealed class TargetTrackingNode : Node 20 | { 21 | private readonly float _noiseSize; 22 | private readonly List> _receiverNodes = new(); 23 | private readonly float _smoothCurveRate; 24 | private readonly float _speed; 25 | 26 | private float _actualSpeed; 27 | private float _angle; 28 | private bool _isForceTracking; 29 | private float _lastDeltaTime; 30 | private Action _onArrived; 31 | 32 | public TargetTrackingNode(float speed = 1, float noiseSize = 1f, float smoothCurveRate = 0.1f) 33 | { 34 | _speed = speed; 35 | _noiseSize = noiseSize; 36 | _smoothCurveRate = smoothCurveRate; 37 | } 38 | 39 | public bool HasTarget => TargetPosition != Vector2.zero; 40 | 41 | public bool AutoTarget { get; set; } = true; 42 | 43 | private float SpeedBias => _speed * 125f; 44 | 45 | public Vector2 TargetPosition { get; private set; } = Vector2.zero; 46 | 47 | public override void Draw(Painter2D painter, float deltaTime) 48 | { 49 | if (SceneOption.IsDebug) 50 | { 51 | var from = Transform.Position; 52 | var to = from + new Vector2(Mathf.Cos(Transform.Rotation), Mathf.Sin(Transform.Rotation)) * 20f; 53 | 54 | painter.fillColor = new Color(1f, 1f, 1f, 0.1f); 55 | painter.strokeColor = new Color(1f, 1f, 1f, 0.1f); 56 | painter.lineWidth = 1f; 57 | 58 | painter.FillCircle(from.x, from.y, 5f); 59 | 60 | painter.BeginPath(); 61 | painter.MoveTo(from); 62 | painter.LineTo(to); 63 | painter.Stroke(); 64 | } 65 | } 66 | 67 | public override void Update(float deltaTime) 68 | { 69 | foreach (var receiverNode in _receiverNodes) 70 | { 71 | var item = receiverNode.ReceivedItem; 72 | if (item == null) continue; 73 | 74 | TargetPosition = item.TargetPosition; 75 | _actualSpeed = item.Speed * SpeedBias; 76 | _onArrived = item.OnArrived; 77 | 78 | _isForceTracking = true; 79 | } 80 | 81 | UpdatePosition(deltaTime); 82 | _lastDeltaTime = deltaTime; 83 | } 84 | 85 | public void AddReceiver(ReceiverNode receiver) 86 | { 87 | _receiverNodes.Add(receiver); 88 | } 89 | 90 | private void UpdatePosition(float deltaTime) 91 | { 92 | if (TargetPosition == Vector2.zero) 93 | { 94 | if (!AutoTarget || _isForceTracking) return; 95 | TargetPosition = new Vector2(Random.Range(0, SceneOption.Width), Random.Range(0, SceneOption.Height)); 96 | _actualSpeed = SpeedBias * (1f + Random.Range(0f, 1f) * 0.5f); 97 | return; 98 | } 99 | 100 | var diff = TargetPosition - Transform.Position; 101 | 102 | var angleDiff = Mathf.Atan2(diff.y, diff.x); 103 | _angle = Mathf.LerpAngle(_angle, angleDiff, _smoothCurveRate); 104 | 105 | var vector = diff.normalized; 106 | var velocity = vector * _actualSpeed + new Vector2(Noise(), Noise()); 107 | 108 | Transform.Velocity = velocity * deltaTime; 109 | Transform.Position += Transform.Velocity; 110 | Transform.Rotation = _angle; 111 | 112 | if (Vector2.Distance(Transform.Position, TargetPosition) < 2f && AutoTarget) 113 | { 114 | TargetPosition = Vector2.zero; 115 | _isForceTracking = false; 116 | _onArrived?.Invoke(); 117 | _onArrived = null; 118 | } 119 | else if (Vector2.Distance(Transform.Position, TargetPosition) < 2f && _isForceTracking) 120 | { 121 | _isForceTracking = false; 122 | _onArrived?.Invoke(); 123 | _onArrived = null; 124 | } 125 | 126 | return; 127 | 128 | float Noise() 129 | { 130 | return Random.Range(0f, 1f) * 0.5f * _actualSpeed * (AutoTarget ? _noiseSize : 0); 131 | } 132 | } 133 | 134 | public void TranslateTargetPosition(Vector2 moveVector, float speed) 135 | { 136 | if (_isForceTracking) return; 137 | 138 | _actualSpeed = speed; 139 | 140 | if (!HasTarget) 141 | TargetPosition = moveVector; 142 | else 143 | TargetPosition += moveVector; 144 | 145 | UpdatePosition(_lastDeltaTime); 146 | } 147 | } 148 | } -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/Nodes/Render/Shapes/JellyFishShape.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UniAquarium.Core.Paints; 3 | using UniAquarium.Foundation; 4 | using UnityEngine; 5 | using UnityEngine.UIElements; 6 | using ITransform = UniAquarium.Core.Paints.ITransform; 7 | using Random = UnityEngine.Random; 8 | 9 | namespace UniAquarium.Aquarium.Nodes 10 | { 11 | internal sealed class JellyFishShape : Shape 12 | { 13 | private const int CapJointCount = 10; 14 | private const float HeadDetail = 30f; 15 | private readonly float _capPointAngleOffsetSpeed; 16 | 17 | private readonly float[] _capPointAngles; 18 | private readonly Color _color; 19 | private readonly Color _headFillColor; 20 | private readonly float _headSize; 21 | private readonly float _headWitherPower; 22 | 23 | private float _capPointAngleOffset; 24 | 25 | public JellyFishShape(Color color) 26 | { 27 | _color = new Color(color.r, color.g, color.b, 0.6f); 28 | _headFillColor = new Color(color.r, color.g, color.b, 0.6f); 29 | 30 | _capPointAngles = new float[CapJointCount]; 31 | _capPointAngleOffset = 0f; 32 | _capPointAngleOffsetSpeed = 0.05f + Random.Range(0f, 1f) * 0.1f; 33 | _headWitherPower = 0.11f; 34 | _headSize = 10f; 35 | } 36 | 37 | 38 | public override void Draw(Painter2D painter, ITransform transform, float deltaTime) 39 | { 40 | var originPosition = transform.Position; 41 | var originRotation = transform.Rotation + 90f * Mathf.Deg2Rad; 42 | 43 | for (var i = 0; i < _capPointAngles.Length - 1; i++) _capPointAngles[i] = _capPointAngles[i + 1] + i; 44 | 45 | _capPointAngleOffset += _capPointAngleOffsetSpeed * deltaTime; 46 | _capPointAngles[^1] = Mathf.Abs(Mathf.Sin(_capPointAngleOffset)) * 30f + 20f; 47 | 48 | using var painterScope = new Painter2DScope(painter); 49 | painterScope.Translate(originPosition); 50 | painterScope.Rotate(originRotation); 51 | 52 | DrawFillHead(painterScope, transform.Scale); 53 | DrawHeadFrame(painterScope, transform.Scale); 54 | } 55 | 56 | private void DrawHeadFrame(Painter2DScope painter, float scale) 57 | { 58 | painter.FillColor = _color; 59 | painter.BeginPath(); 60 | 61 | for (var r = 90; r <= 270f; r += 30) 62 | { 63 | var from = Vector2.zero; 64 | var to = Vector2.zero; 65 | var power = 1f; 66 | for (var i = 0; i < _capPointAngles.Length; i++) 67 | { 68 | power -= _headWitherPower; 69 | var angle = _capPointAngles[i]; 70 | from += 71 | new Vector2( 72 | Mathf.Sin(angle * Mathf.Deg2Rad) * _headSize * scale * 73 | Mathf.Sin(r * Mathf.Deg2Rad) * power, 74 | Mathf.Cos(angle * Mathf.Deg2Rad) * _headSize * scale 75 | ); 76 | 77 | to += 78 | new Vector2( 79 | Mathf.Sin(angle * Mathf.Deg2Rad) * _headSize * scale * 80 | Mathf.Sin((r + HeadDetail) * Mathf.Deg2Rad) * power, 81 | Mathf.Cos(angle * Mathf.Deg2Rad) * _headSize * scale 82 | ); 83 | 84 | if (r == 90 && i == 0) 85 | painter.MoveTo(from); 86 | else 87 | painter.LineTo(from); 88 | 89 | painter.LineTo(to); 90 | } 91 | } 92 | 93 | painter.ClosePath(); 94 | painter.Fill(); 95 | } 96 | 97 | private void DrawFillHead(Painter2DScope painter, float scale) 98 | { 99 | var power = 1f; 100 | var to = Vector2.zero; 101 | 102 | painter.FillColor = _headFillColor; 103 | 104 | painter.BeginPath(); 105 | painter.MoveTo(Vector2.zero); 106 | 107 | var r = 90f; 108 | foreach (var angle in _capPointAngles) 109 | { 110 | power -= _headWitherPower; 111 | to += 112 | new Vector2( 113 | Mathf.Sin(angle * Mathf.Deg2Rad) * _headSize * scale * 114 | Mathf.Sin(r * Mathf.Deg2Rad) * power, 115 | Mathf.Cos(angle * Mathf.Deg2Rad) * _headSize * scale 116 | ); 117 | 118 | painter.LineTo(to); 119 | } 120 | 121 | power = 1f; 122 | to = Vector2.zero; 123 | r = 270f; 124 | var stack = new Stack(); 125 | 126 | foreach (var angle in _capPointAngles) 127 | { 128 | power -= _headWitherPower; 129 | to += 130 | new Vector2( 131 | Mathf.Sin(angle * Mathf.Deg2Rad) * _headSize * scale * 132 | Mathf.Sin(r * Mathf.Deg2Rad) * power, 133 | Mathf.Cos(angle * Mathf.Deg2Rad) * _headSize * scale 134 | ); 135 | stack.Push(to); 136 | } 137 | 138 | while (stack.Count > 0) painter.LineTo(stack.Pop()); 139 | 140 | painter.ClosePath(); 141 | painter.Fill(); 142 | } 143 | } 144 | } -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 5 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | skinWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 16 41 | asyncUploadPersistentBuffer: 1 42 | resolutionScalingFixedDPIFactor: 1 43 | customRenderPipeline: {fileID: 0} 44 | excludedTargetPlatforms: [] 45 | - serializedVersion: 2 46 | name: Low 47 | pixelLightCount: 0 48 | shadows: 0 49 | shadowResolution: 0 50 | shadowProjection: 1 51 | shadowCascades: 1 52 | shadowDistance: 20 53 | shadowNearPlaneOffset: 3 54 | shadowCascade2Split: 0.33333334 55 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 56 | shadowmaskMode: 0 57 | skinWeights: 2 58 | textureQuality: 0 59 | anisotropicTextures: 0 60 | antiAliasing: 0 61 | softParticles: 0 62 | softVegetation: 0 63 | realtimeReflectionProbes: 0 64 | billboardsFaceCameraPosition: 0 65 | vSyncCount: 0 66 | lodBias: 0.4 67 | maximumLODLevel: 0 68 | streamingMipmapsActive: 0 69 | streamingMipmapsAddAllCameras: 1 70 | streamingMipmapsMemoryBudget: 512 71 | streamingMipmapsRenderersPerFrame: 512 72 | streamingMipmapsMaxLevelReduction: 2 73 | streamingMipmapsMaxFileIORequests: 1024 74 | particleRaycastBudget: 16 75 | asyncUploadTimeSlice: 2 76 | asyncUploadBufferSize: 16 77 | asyncUploadPersistentBuffer: 1 78 | resolutionScalingFixedDPIFactor: 1 79 | customRenderPipeline: {fileID: 0} 80 | excludedTargetPlatforms: [] 81 | - serializedVersion: 2 82 | name: Medium 83 | pixelLightCount: 1 84 | shadows: 1 85 | shadowResolution: 0 86 | shadowProjection: 1 87 | shadowCascades: 1 88 | shadowDistance: 20 89 | shadowNearPlaneOffset: 3 90 | shadowCascade2Split: 0.33333334 91 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 92 | shadowmaskMode: 0 93 | skinWeights: 2 94 | textureQuality: 0 95 | anisotropicTextures: 1 96 | antiAliasing: 0 97 | softParticles: 0 98 | softVegetation: 0 99 | realtimeReflectionProbes: 0 100 | billboardsFaceCameraPosition: 0 101 | vSyncCount: 1 102 | lodBias: 0.7 103 | maximumLODLevel: 0 104 | streamingMipmapsActive: 0 105 | streamingMipmapsAddAllCameras: 1 106 | streamingMipmapsMemoryBudget: 512 107 | streamingMipmapsRenderersPerFrame: 512 108 | streamingMipmapsMaxLevelReduction: 2 109 | streamingMipmapsMaxFileIORequests: 1024 110 | particleRaycastBudget: 64 111 | asyncUploadTimeSlice: 2 112 | asyncUploadBufferSize: 16 113 | asyncUploadPersistentBuffer: 1 114 | resolutionScalingFixedDPIFactor: 1 115 | customRenderPipeline: {fileID: 0} 116 | excludedTargetPlatforms: [] 117 | - serializedVersion: 2 118 | name: High 119 | pixelLightCount: 2 120 | shadows: 2 121 | shadowResolution: 1 122 | shadowProjection: 1 123 | shadowCascades: 2 124 | shadowDistance: 40 125 | shadowNearPlaneOffset: 3 126 | shadowCascade2Split: 0.33333334 127 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 128 | shadowmaskMode: 1 129 | skinWeights: 2 130 | textureQuality: 0 131 | anisotropicTextures: 1 132 | antiAliasing: 0 133 | softParticles: 0 134 | softVegetation: 1 135 | realtimeReflectionProbes: 1 136 | billboardsFaceCameraPosition: 1 137 | vSyncCount: 1 138 | lodBias: 1 139 | maximumLODLevel: 0 140 | streamingMipmapsActive: 0 141 | streamingMipmapsAddAllCameras: 1 142 | streamingMipmapsMemoryBudget: 512 143 | streamingMipmapsRenderersPerFrame: 512 144 | streamingMipmapsMaxLevelReduction: 2 145 | streamingMipmapsMaxFileIORequests: 1024 146 | particleRaycastBudget: 256 147 | asyncUploadTimeSlice: 2 148 | asyncUploadBufferSize: 16 149 | asyncUploadPersistentBuffer: 1 150 | resolutionScalingFixedDPIFactor: 1 151 | customRenderPipeline: {fileID: 0} 152 | excludedTargetPlatforms: [] 153 | - serializedVersion: 2 154 | name: Very High 155 | pixelLightCount: 3 156 | shadows: 2 157 | shadowResolution: 2 158 | shadowProjection: 1 159 | shadowCascades: 2 160 | shadowDistance: 70 161 | shadowNearPlaneOffset: 3 162 | shadowCascade2Split: 0.33333334 163 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 164 | shadowmaskMode: 1 165 | skinWeights: 4 166 | textureQuality: 0 167 | anisotropicTextures: 2 168 | antiAliasing: 2 169 | softParticles: 1 170 | softVegetation: 1 171 | realtimeReflectionProbes: 1 172 | billboardsFaceCameraPosition: 1 173 | vSyncCount: 1 174 | lodBias: 1.5 175 | maximumLODLevel: 0 176 | streamingMipmapsActive: 0 177 | streamingMipmapsAddAllCameras: 1 178 | streamingMipmapsMemoryBudget: 512 179 | streamingMipmapsRenderersPerFrame: 512 180 | streamingMipmapsMaxLevelReduction: 2 181 | streamingMipmapsMaxFileIORequests: 1024 182 | particleRaycastBudget: 1024 183 | asyncUploadTimeSlice: 2 184 | asyncUploadBufferSize: 16 185 | asyncUploadPersistentBuffer: 1 186 | resolutionScalingFixedDPIFactor: 1 187 | customRenderPipeline: {fileID: 0} 188 | excludedTargetPlatforms: [] 189 | - serializedVersion: 2 190 | name: Ultra 191 | pixelLightCount: 4 192 | shadows: 2 193 | shadowResolution: 2 194 | shadowProjection: 1 195 | shadowCascades: 4 196 | shadowDistance: 150 197 | shadowNearPlaneOffset: 3 198 | shadowCascade2Split: 0.33333334 199 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 200 | shadowmaskMode: 1 201 | skinWeights: 255 202 | textureQuality: 0 203 | anisotropicTextures: 2 204 | antiAliasing: 2 205 | softParticles: 1 206 | softVegetation: 1 207 | realtimeReflectionProbes: 1 208 | billboardsFaceCameraPosition: 1 209 | vSyncCount: 1 210 | lodBias: 2 211 | maximumLODLevel: 0 212 | streamingMipmapsActive: 0 213 | streamingMipmapsAddAllCameras: 1 214 | streamingMipmapsMemoryBudget: 512 215 | streamingMipmapsRenderersPerFrame: 512 216 | streamingMipmapsMaxLevelReduction: 2 217 | streamingMipmapsMaxFileIORequests: 1024 218 | particleRaycastBudget: 4096 219 | asyncUploadTimeSlice: 2 220 | asyncUploadBufferSize: 16 221 | asyncUploadPersistentBuffer: 1 222 | resolutionScalingFixedDPIFactor: 1 223 | customRenderPipeline: {fileID: 0} 224 | excludedTargetPlatforms: [] 225 | m_PerPlatformDefaultQuality: 226 | Android: 2 227 | Lumin: 5 228 | GameCoreScarlett: 5 229 | GameCoreXboxOne: 5 230 | Nintendo Switch: 5 231 | PS4: 5 232 | PS5: 5 233 | Stadia: 5 234 | Standalone: 5 235 | WebGL: 3 236 | Windows Store Apps: 5 237 | XboxOne: 5 238 | iPhone: 2 239 | tvOS: 2 240 | -------------------------------------------------------------------------------- /Assets/UniAquarium/Editor/Aquarium/UniAquariumSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.IO; 5 | using System.Linq; 6 | using UnityEditor; 7 | using UnityEngine; 8 | using Random = UnityEngine.Random; 9 | 10 | namespace UniAquarium.Aquarium 11 | { 12 | [Serializable] 13 | internal class FishSetting 14 | { 15 | [SerializeField] private FishType _fishType; 16 | [SerializeField] private float _angle; 17 | [SerializeField] private Color _color; 18 | [SerializeField] private Vector2 _location; 19 | [SerializeField] private float _scale; 20 | 21 | 22 | public FishType FishType 23 | { 24 | get => _fishType; 25 | set => _fishType = value; 26 | } 27 | 28 | public float Angle 29 | { 30 | get => _angle; 31 | set => _angle = value; 32 | } 33 | 34 | public Color Color 35 | { 36 | get => _color; 37 | set => _color = value; 38 | } 39 | 40 | public Vector2 Location 41 | { 42 | get => _location; 43 | set => _location = value; 44 | } 45 | 46 | public float Scale 47 | { 48 | get => _scale; 49 | set => _scale = value; 50 | } 51 | } 52 | 53 | [Serializable] 54 | internal class FishGroupSetting 55 | { 56 | [SerializeField] private FishSetting[] _fishSettings; 57 | 58 | public FishSetting[] FishSettings 59 | { 60 | get => _fishSettings; 61 | set => _fishSettings = value; 62 | } 63 | } 64 | 65 | [Serializable] 66 | internal class AquariumSetting 67 | { 68 | [SerializeField] private bool _canClean; 69 | [SerializeField] private bool _canFeed; 70 | 71 | [SerializeField] private FishGroupSetting[] _fishGroupSettings; 72 | 73 | public bool CanClean 74 | { 75 | get => _canClean; 76 | set => _canClean = value; 77 | } 78 | 79 | public bool CanFeed 80 | { 81 | get => _canFeed; 82 | set => _canFeed = value; 83 | } 84 | 85 | public FishGroupSetting[] FishGroupSettings 86 | { 87 | get => _fishGroupSettings; 88 | set => _fishGroupSettings = value; 89 | } 90 | } 91 | 92 | 93 | internal enum FishType 94 | { 95 | Fish, 96 | JellyFish, 97 | Lophophorata 98 | } 99 | 100 | internal sealed class UniAquariumSettings : ScriptableObject 101 | { 102 | private static UniAquariumSettings _instance; 103 | 104 | [SerializeField] private AquariumSetting _aquariumSetting; 105 | 106 | public static UniAquariumSettings Instance 107 | { 108 | get 109 | { 110 | var asset = PlayerSettings.GetPreloadedAssets().OfType() 111 | .FirstOrDefault(); 112 | _instance = asset != null ? asset : CreateInstance(); 113 | return _instance; 114 | } 115 | } 116 | 117 | public AquariumSetting AquariumSetting 118 | { 119 | get => _aquariumSetting ?? GetDefaultSetting(); 120 | private set => _aquariumSetting = value; 121 | } 122 | 123 | [MenuItem("Assets/Create/UniAquarium Settings", priority = -1)] 124 | private static void Create() 125 | { 126 | var asset = PlayerSettings.GetPreloadedAssets().OfType().FirstOrDefault(); 127 | if (asset != null) 128 | { 129 | var path = AssetDatabase.GetAssetPath(asset); 130 | throw new InvalidOperationException($"{nameof(UniAquariumSettings)} already exists at {path}"); 131 | } 132 | 133 | var assetPath = EditorUtility.SaveFilePanelInProject($"Save {nameof(UniAquariumSettings)}", 134 | nameof(UniAquariumSettings), 135 | "asset", "", "Assets"); 136 | 137 | if (string.IsNullOrEmpty(assetPath)) return; 138 | 139 | var folderPath = Path.GetDirectoryName(assetPath); 140 | if (!string.IsNullOrEmpty(folderPath) && !Directory.Exists(folderPath)) 141 | Directory.CreateDirectory(folderPath); 142 | 143 | var instance = CreateInstance(); 144 | instance.AquariumSetting = GetDefaultSetting(); 145 | AssetDatabase.CreateAsset(instance, assetPath); 146 | var preloadedAssets = PlayerSettings.GetPreloadedAssets().ToList(); 147 | preloadedAssets.Add(instance); 148 | PlayerSettings.SetPreloadedAssets(preloadedAssets.ToArray()); 149 | AssetDatabase.SaveAssets(); 150 | } 151 | 152 | private static AquariumSetting GetDefaultSetting() 153 | { 154 | var fishSettings = new List(); 155 | 156 | for (var i = 0; i < 10; i++) 157 | { 158 | var setting = new List(); 159 | var color = Random.ColorHSV(0f, 1f, 0.5f, 1f, 0.5f, 1f); 160 | for (var j = 0; j < Random.Range(5, 7); j++) 161 | setting.Add(new FishSetting 162 | { 163 | FishType = FishType.Fish, 164 | Angle = 0, 165 | Color = color, 166 | Location = new Vector2(0, 0), 167 | Scale = 1 168 | }); 169 | 170 | var fishGroupSetting = new FishGroupSetting 171 | { 172 | FishSettings = setting.ToArray() 173 | }; 174 | 175 | fishSettings.Add(fishGroupSetting); 176 | } 177 | 178 | for (var i = 0; i < 10; i++) 179 | { 180 | var setting = new List(); 181 | var location = new Vector2(Random.Range(100f, 600f), Random.Range(100f, 600f)); 182 | setting.Add(new FishSetting 183 | { 184 | FishType = FishType.JellyFish, 185 | Angle = 0, 186 | Color = Random.ColorHSV(0f, 1f, 0.5f, 1f, 0.5f, 1f), 187 | Location = location, 188 | Scale = 1 189 | }); 190 | 191 | var jellyFishGroupSetting = new FishGroupSetting 192 | { 193 | FishSettings = setting.ToArray() 194 | }; 195 | 196 | fishSettings.Add(jellyFishGroupSetting); 197 | } 198 | 199 | var lophosporateSetting = new List 200 | { 201 | new() 202 | { 203 | FishType = FishType.Lophophorata, 204 | Angle = 0, 205 | Color = HexToColor("#3F51B5"), 206 | Location = new Vector2(120, 200), 207 | Scale = 1 208 | } 209 | }; 210 | 211 | var lophosporateFishGroupSetting = new FishGroupSetting 212 | { 213 | FishSettings = lophosporateSetting.ToArray() 214 | }; 215 | 216 | fishSettings.Add(lophosporateFishGroupSetting); 217 | 218 | 219 | return new AquariumSetting 220 | { 221 | FishGroupSettings = fishSettings.ToArray(), 222 | CanClean = true, 223 | CanFeed = true 224 | }; 225 | } 226 | 227 | private static Color HexToColor(string hex) 228 | { 229 | hex = hex.Replace("#", ""); 230 | 231 | var r = byte.Parse(hex.Substring(0, 2), NumberStyles.HexNumber); 232 | var g = byte.Parse(hex.Substring(2, 2), NumberStyles.HexNumber); 233 | var b = byte.Parse(hex.Substring(4, 2), NumberStyles.HexNumber); 234 | byte a = 255; 235 | 236 | if (hex.Length == 8) 237 | a = byte.Parse(hex.Substring(6, 2), NumberStyles.HexNumber); 238 | 239 | return new Color(r / 255f, g / 255f, b / 255f, a / 255f); 240 | } 241 | } 242 | } -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | - serializedVersion: 3 297 | m_Name: Enable Debug Button 1 298 | descriptiveName: 299 | descriptiveNegativeName: 300 | negativeButton: 301 | positiveButton: left ctrl 302 | altNegativeButton: 303 | altPositiveButton: joystick button 8 304 | gravity: 0 305 | dead: 0 306 | sensitivity: 0 307 | snap: 0 308 | invert: 0 309 | type: 0 310 | axis: 0 311 | joyNum: 0 312 | - serializedVersion: 3 313 | m_Name: Enable Debug Button 2 314 | descriptiveName: 315 | descriptiveNegativeName: 316 | negativeButton: 317 | positiveButton: backspace 318 | altNegativeButton: 319 | altPositiveButton: joystick button 9 320 | gravity: 0 321 | dead: 0 322 | sensitivity: 0 323 | snap: 0 324 | invert: 0 325 | type: 0 326 | axis: 0 327 | joyNum: 0 328 | - serializedVersion: 3 329 | m_Name: Debug Reset 330 | descriptiveName: 331 | descriptiveNegativeName: 332 | negativeButton: 333 | positiveButton: left alt 334 | altNegativeButton: 335 | altPositiveButton: joystick button 1 336 | gravity: 0 337 | dead: 0 338 | sensitivity: 0 339 | snap: 0 340 | invert: 0 341 | type: 0 342 | axis: 0 343 | joyNum: 0 344 | - serializedVersion: 3 345 | m_Name: Debug Next 346 | descriptiveName: 347 | descriptiveNegativeName: 348 | negativeButton: 349 | positiveButton: page down 350 | altNegativeButton: 351 | altPositiveButton: joystick button 5 352 | gravity: 0 353 | dead: 0 354 | sensitivity: 0 355 | snap: 0 356 | invert: 0 357 | type: 0 358 | axis: 0 359 | joyNum: 0 360 | - serializedVersion: 3 361 | m_Name: Debug Previous 362 | descriptiveName: 363 | descriptiveNegativeName: 364 | negativeButton: 365 | positiveButton: page up 366 | altNegativeButton: 367 | altPositiveButton: joystick button 4 368 | gravity: 0 369 | dead: 0 370 | sensitivity: 0 371 | snap: 0 372 | invert: 0 373 | type: 0 374 | axis: 0 375 | joyNum: 0 376 | - serializedVersion: 3 377 | m_Name: Debug Validate 378 | descriptiveName: 379 | descriptiveNegativeName: 380 | negativeButton: 381 | positiveButton: return 382 | altNegativeButton: 383 | altPositiveButton: joystick button 0 384 | gravity: 0 385 | dead: 0 386 | sensitivity: 0 387 | snap: 0 388 | invert: 0 389 | type: 0 390 | axis: 0 391 | joyNum: 0 392 | - serializedVersion: 3 393 | m_Name: Debug Persistent 394 | descriptiveName: 395 | descriptiveNegativeName: 396 | negativeButton: 397 | positiveButton: right shift 398 | altNegativeButton: 399 | altPositiveButton: joystick button 2 400 | gravity: 0 401 | dead: 0 402 | sensitivity: 0 403 | snap: 0 404 | invert: 0 405 | type: 0 406 | axis: 0 407 | joyNum: 0 408 | - serializedVersion: 3 409 | m_Name: Debug Multiplier 410 | descriptiveName: 411 | descriptiveNegativeName: 412 | negativeButton: 413 | positiveButton: left shift 414 | altNegativeButton: 415 | altPositiveButton: joystick button 3 416 | gravity: 0 417 | dead: 0 418 | sensitivity: 0 419 | snap: 0 420 | invert: 0 421 | type: 0 422 | axis: 0 423 | joyNum: 0 424 | - serializedVersion: 3 425 | m_Name: Debug Horizontal 426 | descriptiveName: 427 | descriptiveNegativeName: 428 | negativeButton: left 429 | positiveButton: right 430 | altNegativeButton: 431 | altPositiveButton: 432 | gravity: 1000 433 | dead: 0.001 434 | sensitivity: 1000 435 | snap: 0 436 | invert: 0 437 | type: 0 438 | axis: 0 439 | joyNum: 0 440 | - serializedVersion: 3 441 | m_Name: Debug Vertical 442 | descriptiveName: 443 | descriptiveNegativeName: 444 | negativeButton: down 445 | positiveButton: up 446 | altNegativeButton: 447 | altPositiveButton: 448 | gravity: 1000 449 | dead: 0.001 450 | sensitivity: 1000 451 | snap: 0 452 | invert: 0 453 | type: 0 454 | axis: 0 455 | joyNum: 0 456 | - serializedVersion: 3 457 | m_Name: Debug Vertical 458 | descriptiveName: 459 | descriptiveNegativeName: 460 | negativeButton: down 461 | positiveButton: up 462 | altNegativeButton: 463 | altPositiveButton: 464 | gravity: 1000 465 | dead: 0.001 466 | sensitivity: 1000 467 | snap: 0 468 | invert: 0 469 | type: 2 470 | axis: 6 471 | joyNum: 0 472 | - serializedVersion: 3 473 | m_Name: Debug Horizontal 474 | descriptiveName: 475 | descriptiveNegativeName: 476 | negativeButton: left 477 | positiveButton: right 478 | altNegativeButton: 479 | altPositiveButton: 480 | gravity: 1000 481 | dead: 0.001 482 | sensitivity: 1000 483 | snap: 0 484 | invert: 0 485 | type: 2 486 | axis: 5 487 | joyNum: 0 488 | -------------------------------------------------------------------------------- /Packages/packages-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.2d.animation": { 4 | "version": "9.0.3", 5 | "depth": 1, 6 | "source": "registry", 7 | "dependencies": { 8 | "com.unity.2d.common": "8.0.1", 9 | "com.unity.2d.sprite": "1.0.0", 10 | "com.unity.collections": "1.1.0", 11 | "com.unity.modules.animation": "1.0.0", 12 | "com.unity.modules.uielements": "1.0.0" 13 | }, 14 | "url": "https://packages.unity.com" 15 | }, 16 | "com.unity.2d.aseprite": { 17 | "version": "1.0.1", 18 | "depth": 1, 19 | "source": "registry", 20 | "dependencies": { 21 | "com.unity.2d.sprite": "1.0.0", 22 | "com.unity.2d.common": "6.0.6", 23 | "com.unity.mathematics": "1.2.6", 24 | "com.unity.modules.animation": "1.0.0" 25 | }, 26 | "url": "https://packages.unity.com" 27 | }, 28 | "com.unity.2d.common": { 29 | "version": "8.0.1", 30 | "depth": 2, 31 | "source": "registry", 32 | "dependencies": { 33 | "com.unity.2d.sprite": "1.0.0", 34 | "com.unity.mathematics": "1.1.0", 35 | "com.unity.modules.uielements": "1.0.0", 36 | "com.unity.modules.animation": "1.0.0", 37 | "com.unity.burst": "1.7.3" 38 | }, 39 | "url": "https://packages.unity.com" 40 | }, 41 | "com.unity.2d.pixel-perfect": { 42 | "version": "5.0.3", 43 | "depth": 1, 44 | "source": "registry", 45 | "dependencies": {}, 46 | "url": "https://packages.unity.com" 47 | }, 48 | "com.unity.2d.psdimporter": { 49 | "version": "8.0.2", 50 | "depth": 1, 51 | "source": "registry", 52 | "dependencies": { 53 | "com.unity.2d.animation": "9.0.1", 54 | "com.unity.2d.common": "8.0.1", 55 | "com.unity.2d.sprite": "1.0.0" 56 | }, 57 | "url": "https://packages.unity.com" 58 | }, 59 | "com.unity.2d.sprite": { 60 | "version": "1.0.0", 61 | "depth": 1, 62 | "source": "builtin", 63 | "dependencies": {} 64 | }, 65 | "com.unity.2d.spriteshape": { 66 | "version": "9.0.2", 67 | "depth": 1, 68 | "source": "registry", 69 | "dependencies": { 70 | "com.unity.mathematics": "1.1.0", 71 | "com.unity.2d.common": "8.0.1", 72 | "com.unity.modules.physics2d": "1.0.0" 73 | }, 74 | "url": "https://packages.unity.com" 75 | }, 76 | "com.unity.2d.tilemap": { 77 | "version": "1.0.0", 78 | "depth": 1, 79 | "source": "builtin", 80 | "dependencies": { 81 | "com.unity.modules.tilemap": "1.0.0", 82 | "com.unity.modules.uielements": "1.0.0" 83 | } 84 | }, 85 | "com.unity.2d.tilemap.extras": { 86 | "version": "3.1.1", 87 | "depth": 1, 88 | "source": "registry", 89 | "dependencies": { 90 | "com.unity.modules.tilemap": "1.0.0", 91 | "com.unity.2d.tilemap": "1.0.0", 92 | "com.unity.ugui": "1.0.0", 93 | "com.unity.modules.jsonserialize": "1.0.0" 94 | }, 95 | "url": "https://packages.unity.com" 96 | }, 97 | "com.unity.burst": { 98 | "version": "1.8.8", 99 | "depth": 3, 100 | "source": "registry", 101 | "dependencies": { 102 | "com.unity.mathematics": "1.2.1" 103 | }, 104 | "url": "https://packages.unity.com" 105 | }, 106 | "com.unity.collab-proxy": { 107 | "version": "2.0.7", 108 | "depth": 0, 109 | "source": "registry", 110 | "dependencies": {}, 111 | "url": "https://packages.unity.com" 112 | }, 113 | "com.unity.collections": { 114 | "version": "1.2.4", 115 | "depth": 2, 116 | "source": "registry", 117 | "dependencies": { 118 | "com.unity.burst": "1.6.6", 119 | "com.unity.test-framework": "1.1.31" 120 | }, 121 | "url": "https://packages.unity.com" 122 | }, 123 | "com.unity.ext.nunit": { 124 | "version": "1.0.6", 125 | "depth": 1, 126 | "source": "registry", 127 | "dependencies": {}, 128 | "url": "https://packages.unity.com" 129 | }, 130 | "com.unity.feature.2d": { 131 | "version": "2.0.0", 132 | "depth": 0, 133 | "source": "builtin", 134 | "dependencies": { 135 | "com.unity.2d.animation": "9.0.3", 136 | "com.unity.2d.pixel-perfect": "5.0.3", 137 | "com.unity.2d.psdimporter": "8.0.2", 138 | "com.unity.2d.sprite": "1.0.0", 139 | "com.unity.2d.spriteshape": "9.0.2", 140 | "com.unity.2d.tilemap": "1.0.0", 141 | "com.unity.2d.tilemap.extras": "3.1.1", 142 | "com.unity.2d.aseprite": "1.0.1" 143 | } 144 | }, 145 | "com.unity.ide.rider": { 146 | "version": "3.0.24", 147 | "depth": 0, 148 | "source": "registry", 149 | "dependencies": { 150 | "com.unity.ext.nunit": "1.0.6" 151 | }, 152 | "url": "https://packages.unity.com" 153 | }, 154 | "com.unity.ide.visualstudio": { 155 | "version": "2.0.18", 156 | "depth": 0, 157 | "source": "registry", 158 | "dependencies": { 159 | "com.unity.test-framework": "1.1.9" 160 | }, 161 | "url": "https://packages.unity.com" 162 | }, 163 | "com.unity.mathematics": { 164 | "version": "1.2.6", 165 | "depth": 2, 166 | "source": "registry", 167 | "dependencies": {}, 168 | "url": "https://packages.unity.com" 169 | }, 170 | "com.unity.test-framework": { 171 | "version": "1.1.33", 172 | "depth": 0, 173 | "source": "registry", 174 | "dependencies": { 175 | "com.unity.ext.nunit": "1.0.6", 176 | "com.unity.modules.imgui": "1.0.0", 177 | "com.unity.modules.jsonserialize": "1.0.0" 178 | }, 179 | "url": "https://packages.unity.com" 180 | }, 181 | "com.unity.textmeshpro": { 182 | "version": "3.0.6", 183 | "depth": 0, 184 | "source": "registry", 185 | "dependencies": { 186 | "com.unity.ugui": "1.0.0" 187 | }, 188 | "url": "https://packages.unity.com" 189 | }, 190 | "com.unity.timeline": { 191 | "version": "1.7.5", 192 | "depth": 0, 193 | "source": "registry", 194 | "dependencies": { 195 | "com.unity.modules.director": "1.0.0", 196 | "com.unity.modules.animation": "1.0.0", 197 | "com.unity.modules.audio": "1.0.0", 198 | "com.unity.modules.particlesystem": "1.0.0" 199 | }, 200 | "url": "https://packages.unity.com" 201 | }, 202 | "com.unity.ugui": { 203 | "version": "1.0.0", 204 | "depth": 0, 205 | "source": "builtin", 206 | "dependencies": { 207 | "com.unity.modules.ui": "1.0.0", 208 | "com.unity.modules.imgui": "1.0.0" 209 | } 210 | }, 211 | "com.unity.visualscripting": { 212 | "version": "1.9.0", 213 | "depth": 0, 214 | "source": "registry", 215 | "dependencies": { 216 | "com.unity.ugui": "1.0.0", 217 | "com.unity.modules.jsonserialize": "1.0.0" 218 | }, 219 | "url": "https://packages.unity.com" 220 | }, 221 | "com.unity.modules.ai": { 222 | "version": "1.0.0", 223 | "depth": 0, 224 | "source": "builtin", 225 | "dependencies": {} 226 | }, 227 | "com.unity.modules.androidjni": { 228 | "version": "1.0.0", 229 | "depth": 0, 230 | "source": "builtin", 231 | "dependencies": {} 232 | }, 233 | "com.unity.modules.animation": { 234 | "version": "1.0.0", 235 | "depth": 0, 236 | "source": "builtin", 237 | "dependencies": {} 238 | }, 239 | "com.unity.modules.assetbundle": { 240 | "version": "1.0.0", 241 | "depth": 0, 242 | "source": "builtin", 243 | "dependencies": {} 244 | }, 245 | "com.unity.modules.audio": { 246 | "version": "1.0.0", 247 | "depth": 0, 248 | "source": "builtin", 249 | "dependencies": {} 250 | }, 251 | "com.unity.modules.cloth": { 252 | "version": "1.0.0", 253 | "depth": 0, 254 | "source": "builtin", 255 | "dependencies": { 256 | "com.unity.modules.physics": "1.0.0" 257 | } 258 | }, 259 | "com.unity.modules.director": { 260 | "version": "1.0.0", 261 | "depth": 0, 262 | "source": "builtin", 263 | "dependencies": { 264 | "com.unity.modules.audio": "1.0.0", 265 | "com.unity.modules.animation": "1.0.0" 266 | } 267 | }, 268 | "com.unity.modules.imageconversion": { 269 | "version": "1.0.0", 270 | "depth": 0, 271 | "source": "builtin", 272 | "dependencies": {} 273 | }, 274 | "com.unity.modules.imgui": { 275 | "version": "1.0.0", 276 | "depth": 0, 277 | "source": "builtin", 278 | "dependencies": {} 279 | }, 280 | "com.unity.modules.jsonserialize": { 281 | "version": "1.0.0", 282 | "depth": 0, 283 | "source": "builtin", 284 | "dependencies": {} 285 | }, 286 | "com.unity.modules.particlesystem": { 287 | "version": "1.0.0", 288 | "depth": 0, 289 | "source": "builtin", 290 | "dependencies": {} 291 | }, 292 | "com.unity.modules.physics": { 293 | "version": "1.0.0", 294 | "depth": 0, 295 | "source": "builtin", 296 | "dependencies": {} 297 | }, 298 | "com.unity.modules.physics2d": { 299 | "version": "1.0.0", 300 | "depth": 0, 301 | "source": "builtin", 302 | "dependencies": {} 303 | }, 304 | "com.unity.modules.screencapture": { 305 | "version": "1.0.0", 306 | "depth": 0, 307 | "source": "builtin", 308 | "dependencies": { 309 | "com.unity.modules.imageconversion": "1.0.0" 310 | } 311 | }, 312 | "com.unity.modules.subsystems": { 313 | "version": "1.0.0", 314 | "depth": 1, 315 | "source": "builtin", 316 | "dependencies": { 317 | "com.unity.modules.jsonserialize": "1.0.0" 318 | } 319 | }, 320 | "com.unity.modules.terrain": { 321 | "version": "1.0.0", 322 | "depth": 0, 323 | "source": "builtin", 324 | "dependencies": {} 325 | }, 326 | "com.unity.modules.terrainphysics": { 327 | "version": "1.0.0", 328 | "depth": 0, 329 | "source": "builtin", 330 | "dependencies": { 331 | "com.unity.modules.physics": "1.0.0", 332 | "com.unity.modules.terrain": "1.0.0" 333 | } 334 | }, 335 | "com.unity.modules.tilemap": { 336 | "version": "1.0.0", 337 | "depth": 0, 338 | "source": "builtin", 339 | "dependencies": { 340 | "com.unity.modules.physics2d": "1.0.0" 341 | } 342 | }, 343 | "com.unity.modules.ui": { 344 | "version": "1.0.0", 345 | "depth": 0, 346 | "source": "builtin", 347 | "dependencies": {} 348 | }, 349 | "com.unity.modules.uielements": { 350 | "version": "1.0.0", 351 | "depth": 0, 352 | "source": "builtin", 353 | "dependencies": { 354 | "com.unity.modules.ui": "1.0.0", 355 | "com.unity.modules.imgui": "1.0.0", 356 | "com.unity.modules.jsonserialize": "1.0.0" 357 | } 358 | }, 359 | "com.unity.modules.umbra": { 360 | "version": "1.0.0", 361 | "depth": 0, 362 | "source": "builtin", 363 | "dependencies": {} 364 | }, 365 | "com.unity.modules.unityanalytics": { 366 | "version": "1.0.0", 367 | "depth": 0, 368 | "source": "builtin", 369 | "dependencies": { 370 | "com.unity.modules.unitywebrequest": "1.0.0", 371 | "com.unity.modules.jsonserialize": "1.0.0" 372 | } 373 | }, 374 | "com.unity.modules.unitywebrequest": { 375 | "version": "1.0.0", 376 | "depth": 0, 377 | "source": "builtin", 378 | "dependencies": {} 379 | }, 380 | "com.unity.modules.unitywebrequestassetbundle": { 381 | "version": "1.0.0", 382 | "depth": 0, 383 | "source": "builtin", 384 | "dependencies": { 385 | "com.unity.modules.assetbundle": "1.0.0", 386 | "com.unity.modules.unitywebrequest": "1.0.0" 387 | } 388 | }, 389 | "com.unity.modules.unitywebrequestaudio": { 390 | "version": "1.0.0", 391 | "depth": 0, 392 | "source": "builtin", 393 | "dependencies": { 394 | "com.unity.modules.unitywebrequest": "1.0.0", 395 | "com.unity.modules.audio": "1.0.0" 396 | } 397 | }, 398 | "com.unity.modules.unitywebrequesttexture": { 399 | "version": "1.0.0", 400 | "depth": 0, 401 | "source": "builtin", 402 | "dependencies": { 403 | "com.unity.modules.unitywebrequest": "1.0.0", 404 | "com.unity.modules.imageconversion": "1.0.0" 405 | } 406 | }, 407 | "com.unity.modules.unitywebrequestwww": { 408 | "version": "1.0.0", 409 | "depth": 0, 410 | "source": "builtin", 411 | "dependencies": { 412 | "com.unity.modules.unitywebrequest": "1.0.0", 413 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 414 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 415 | "com.unity.modules.audio": "1.0.0", 416 | "com.unity.modules.assetbundle": "1.0.0", 417 | "com.unity.modules.imageconversion": "1.0.0" 418 | } 419 | }, 420 | "com.unity.modules.vehicles": { 421 | "version": "1.0.0", 422 | "depth": 0, 423 | "source": "builtin", 424 | "dependencies": { 425 | "com.unity.modules.physics": "1.0.0" 426 | } 427 | }, 428 | "com.unity.modules.video": { 429 | "version": "1.0.0", 430 | "depth": 0, 431 | "source": "builtin", 432 | "dependencies": { 433 | "com.unity.modules.audio": "1.0.0", 434 | "com.unity.modules.ui": "1.0.0", 435 | "com.unity.modules.unitywebrequest": "1.0.0" 436 | } 437 | }, 438 | "com.unity.modules.vr": { 439 | "version": "1.0.0", 440 | "depth": 0, 441 | "source": "builtin", 442 | "dependencies": { 443 | "com.unity.modules.jsonserialize": "1.0.0", 444 | "com.unity.modules.physics": "1.0.0", 445 | "com.unity.modules.xr": "1.0.0" 446 | } 447 | }, 448 | "com.unity.modules.wind": { 449 | "version": "1.0.0", 450 | "depth": 0, 451 | "source": "builtin", 452 | "dependencies": {} 453 | }, 454 | "com.unity.modules.xr": { 455 | "version": "1.0.0", 456 | "depth": 0, 457 | "source": "builtin", 458 | "dependencies": { 459 | "com.unity.modules.physics": "1.0.0", 460 | "com.unity.modules.jsonserialize": "1.0.0", 461 | "com.unity.modules.subsystems": "1.0.0" 462 | } 463 | } 464 | } 465 | } 466 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 26 7 | productGUID: ca3b1a0cf8e65db48b7f75c6ba4afe0b 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: DefaultCompany 16 | productName: UniAquarium 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1920 46 | defaultScreenHeight: 1080 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 1 51 | m_SpriteBatchVertexThreshold: 300 52 | m_MTRendering: 1 53 | mipStripping: 0 54 | numberOfMipsStripped: 0 55 | numberOfMipsStrippedPerMipmapLimitGroup: {} 56 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 57 | iosShowActivityIndicatorOnLoading: -1 58 | androidShowActivityIndicatorOnLoading: -1 59 | iosUseCustomAppBackgroundBehavior: 0 60 | allowedAutorotateToPortrait: 1 61 | allowedAutorotateToPortraitUpsideDown: 1 62 | allowedAutorotateToLandscapeRight: 1 63 | allowedAutorotateToLandscapeLeft: 1 64 | useOSAutorotation: 1 65 | use32BitDisplayBuffer: 1 66 | preserveFramebufferAlpha: 0 67 | disableDepthAndStencilBuffers: 0 68 | androidStartInFullscreen: 1 69 | androidRenderOutsideSafeArea: 1 70 | androidUseSwappy: 1 71 | androidBlitType: 0 72 | androidResizableWindow: 0 73 | androidDefaultWindowWidth: 1920 74 | androidDefaultWindowHeight: 1080 75 | androidMinimumWindowWidth: 400 76 | androidMinimumWindowHeight: 300 77 | androidFullscreenMode: 1 78 | defaultIsNativeResolution: 1 79 | macRetinaSupport: 1 80 | runInBackground: 0 81 | captureSingleScreen: 0 82 | muteOtherAudioSources: 0 83 | Prepare IOS For Recording: 0 84 | Force IOS Speakers When Recording: 0 85 | deferSystemGesturesMode: 0 86 | hideHomeButton: 0 87 | submitAnalytics: 1 88 | usePlayerLog: 1 89 | dedicatedServerOptimizations: 0 90 | bakeCollisionMeshes: 0 91 | forceSingleInstance: 0 92 | useFlipModelSwapchain: 1 93 | resizableWindow: 0 94 | useMacAppStoreValidation: 0 95 | macAppStoreCategory: public.app-category.games 96 | gpuSkinning: 0 97 | xboxPIXTextureCapture: 0 98 | xboxEnableAvatar: 0 99 | xboxEnableKinect: 0 100 | xboxEnableKinectAutoTracking: 0 101 | xboxEnableFitness: 0 102 | visibleInBackground: 1 103 | allowFullscreenSwitch: 1 104 | fullscreenMode: 1 105 | xboxSpeechDB: 0 106 | xboxEnableHeadOrientation: 0 107 | xboxEnableGuest: 0 108 | xboxEnablePIXSampling: 0 109 | metalFramebufferOnly: 0 110 | xboxOneResolution: 0 111 | xboxOneSResolution: 0 112 | xboxOneXResolution: 3 113 | xboxOneMonoLoggingLevel: 0 114 | xboxOneLoggingLevel: 1 115 | xboxOneDisableEsram: 0 116 | xboxOneEnableTypeOptimization: 0 117 | xboxOnePresentImmediateThreshold: 0 118 | switchQueueCommandMemory: 1048576 119 | switchQueueControlMemory: 16384 120 | switchQueueComputeMemory: 262144 121 | switchNVNShaderPoolsGranularity: 33554432 122 | switchNVNDefaultPoolsGranularity: 16777216 123 | switchNVNOtherPoolsGranularity: 16777216 124 | switchGpuScratchPoolGranularity: 2097152 125 | switchAllowGpuScratchShrinking: 0 126 | switchNVNMaxPublicTextureIDCount: 0 127 | switchNVNMaxPublicSamplerIDCount: 0 128 | switchNVNGraphicsFirmwareMemory: 32 129 | switchMaxWorkerMultiple: 8 130 | stadiaPresentMode: 0 131 | stadiaTargetFramerate: 0 132 | vulkanNumSwapchainBuffers: 3 133 | vulkanEnableSetSRGBWrite: 0 134 | vulkanEnablePreTransform: 0 135 | vulkanEnableLateAcquireNextImage: 0 136 | vulkanEnableCommandBufferRecycling: 1 137 | loadStoreDebugModeEnabled: 0 138 | bundleVersion: 1.0 139 | preloadedAssets: 140 | - {fileID: 0} 141 | - {fileID: 0} 142 | - {fileID: 0} 143 | - {fileID: 11400000, guid: 82195326b5b37e741a0a598a3462cdcc, type: 2} 144 | metroInputSource: 0 145 | wsaTransparentSwapchain: 0 146 | m_HolographicPauseOnTrackingLoss: 1 147 | xboxOneDisableKinectGpuReservation: 1 148 | xboxOneEnable7thCore: 1 149 | vrSettings: 150 | enable360StereoCapture: 0 151 | isWsaHolographicRemotingEnabled: 0 152 | enableFrameTimingStats: 0 153 | enableOpenGLProfilerGPURecorders: 1 154 | useHDRDisplay: 0 155 | hdrBitDepth: 0 156 | m_ColorGamuts: 00000000 157 | targetPixelDensity: 30 158 | resolutionScalingMode: 0 159 | resetResolutionOnWindowResize: 0 160 | androidSupportedAspectRatio: 1 161 | androidMaxAspectRatio: 2.1 162 | applicationIdentifier: 163 | Standalone: com.DefaultCompany.2DProject 164 | buildNumber: 165 | Standalone: 0 166 | VisionOS: 0 167 | iPhone: 0 168 | tvOS: 0 169 | overrideDefaultApplicationIdentifier: 1 170 | AndroidBundleVersionCode: 1 171 | AndroidMinSdkVersion: 22 172 | AndroidTargetSdkVersion: 0 173 | AndroidPreferredInstallLocation: 1 174 | aotOptions: 175 | stripEngineCode: 1 176 | iPhoneStrippingLevel: 0 177 | iPhoneScriptCallOptimization: 0 178 | ForceInternetPermission: 0 179 | ForceSDCardPermission: 0 180 | CreateWallpaper: 0 181 | APKExpansionFiles: 0 182 | keepLoadedShadersAlive: 0 183 | StripUnusedMeshComponents: 0 184 | strictShaderVariantMatching: 0 185 | VertexChannelCompressionMask: 4054 186 | iPhoneSdkVersion: 988 187 | iOSTargetOSVersionString: 12.0 188 | tvOSSdkVersion: 0 189 | tvOSRequireExtendedGameController: 0 190 | tvOSTargetOSVersionString: 12.0 191 | VisionOSSdkVersion: 0 192 | VisionOSTargetOSVersionString: 1.0 193 | uIPrerenderedIcon: 0 194 | uIRequiresPersistentWiFi: 0 195 | uIRequiresFullScreen: 1 196 | uIStatusBarHidden: 1 197 | uIExitOnSuspend: 0 198 | uIStatusBarStyle: 0 199 | appleTVSplashScreen: {fileID: 0} 200 | appleTVSplashScreen2x: {fileID: 0} 201 | tvOSSmallIconLayers: [] 202 | tvOSSmallIconLayers2x: [] 203 | tvOSLargeIconLayers: [] 204 | tvOSLargeIconLayers2x: [] 205 | tvOSTopShelfImageLayers: [] 206 | tvOSTopShelfImageLayers2x: [] 207 | tvOSTopShelfImageWideLayers: [] 208 | tvOSTopShelfImageWideLayers2x: [] 209 | iOSLaunchScreenType: 0 210 | iOSLaunchScreenPortrait: {fileID: 0} 211 | iOSLaunchScreenLandscape: {fileID: 0} 212 | iOSLaunchScreenBackgroundColor: 213 | serializedVersion: 2 214 | rgba: 0 215 | iOSLaunchScreenFillPct: 100 216 | iOSLaunchScreenSize: 100 217 | iOSLaunchScreenCustomXibPath: 218 | iOSLaunchScreeniPadType: 0 219 | iOSLaunchScreeniPadImage: {fileID: 0} 220 | iOSLaunchScreeniPadBackgroundColor: 221 | serializedVersion: 2 222 | rgba: 0 223 | iOSLaunchScreeniPadFillPct: 100 224 | iOSLaunchScreeniPadSize: 100 225 | iOSLaunchScreeniPadCustomXibPath: 226 | iOSLaunchScreenCustomStoryboardPath: 227 | iOSLaunchScreeniPadCustomStoryboardPath: 228 | iOSDeviceRequirements: [] 229 | iOSURLSchemes: [] 230 | macOSURLSchemes: [] 231 | iOSBackgroundModes: 0 232 | iOSMetalForceHardShadows: 0 233 | metalEditorSupport: 1 234 | metalAPIValidation: 1 235 | iOSRenderExtraFrameOnPause: 0 236 | iosCopyPluginsCodeInsteadOfSymlink: 0 237 | appleDeveloperTeamID: 238 | iOSManualSigningProvisioningProfileID: 239 | tvOSManualSigningProvisioningProfileID: 240 | VisionOSManualSigningProvisioningProfileID: 241 | iOSManualSigningProvisioningProfileType: 0 242 | tvOSManualSigningProvisioningProfileType: 0 243 | VisionOSManualSigningProvisioningProfileType: 0 244 | appleEnableAutomaticSigning: 0 245 | iOSRequireARKit: 0 246 | iOSAutomaticallyDetectAndAddCapabilities: 1 247 | appleEnableProMotion: 0 248 | shaderPrecisionModel: 0 249 | clonedFromGUID: 10ad67313f4034357812315f3c407484 250 | templatePackageId: com.unity.template.2d@7.0.3 251 | templateDefaultScene: Assets/Scenes/SampleScene.unity 252 | useCustomMainManifest: 0 253 | useCustomLauncherManifest: 0 254 | useCustomMainGradleTemplate: 0 255 | useCustomLauncherGradleManifest: 0 256 | useCustomBaseGradleTemplate: 0 257 | useCustomGradlePropertiesTemplate: 0 258 | useCustomGradleSettingsTemplate: 0 259 | useCustomProguardFile: 0 260 | AndroidTargetArchitectures: 1 261 | AndroidTargetDevices: 0 262 | AndroidSplashScreenScale: 0 263 | androidSplashScreen: {fileID: 0} 264 | AndroidKeystoreName: 265 | AndroidKeyaliasName: 266 | AndroidEnableArmv9SecurityFeatures: 0 267 | AndroidBuildApkPerCpuArchitecture: 0 268 | AndroidTVCompatibility: 0 269 | AndroidIsGame: 1 270 | AndroidEnableTango: 0 271 | androidEnableBanner: 1 272 | androidUseLowAccuracyLocation: 0 273 | androidUseCustomKeystore: 0 274 | m_AndroidBanners: 275 | - width: 320 276 | height: 180 277 | banner: {fileID: 0} 278 | androidGamepadSupportLevel: 0 279 | chromeosInputEmulation: 1 280 | AndroidMinifyRelease: 0 281 | AndroidMinifyDebug: 0 282 | AndroidValidateAppBundleSize: 1 283 | AndroidAppBundleSizeToValidate: 150 284 | m_BuildTargetIcons: [] 285 | m_BuildTargetPlatformIcons: [] 286 | m_BuildTargetBatching: [] 287 | m_BuildTargetShaderSettings: [] 288 | m_BuildTargetGraphicsJobs: 289 | - m_BuildTarget: MacStandaloneSupport 290 | m_GraphicsJobs: 0 291 | - m_BuildTarget: Switch 292 | m_GraphicsJobs: 0 293 | - m_BuildTarget: MetroSupport 294 | m_GraphicsJobs: 0 295 | - m_BuildTarget: AppleTVSupport 296 | m_GraphicsJobs: 0 297 | - m_BuildTarget: BJMSupport 298 | m_GraphicsJobs: 0 299 | - m_BuildTarget: LinuxStandaloneSupport 300 | m_GraphicsJobs: 0 301 | - m_BuildTarget: PS4Player 302 | m_GraphicsJobs: 0 303 | - m_BuildTarget: iOSSupport 304 | m_GraphicsJobs: 0 305 | - m_BuildTarget: WindowsStandaloneSupport 306 | m_GraphicsJobs: 0 307 | - m_BuildTarget: XboxOnePlayer 308 | m_GraphicsJobs: 0 309 | - m_BuildTarget: LuminSupport 310 | m_GraphicsJobs: 0 311 | - m_BuildTarget: AndroidPlayer 312 | m_GraphicsJobs: 0 313 | - m_BuildTarget: WebGLSupport 314 | m_GraphicsJobs: 0 315 | m_BuildTargetGraphicsJobMode: [] 316 | m_BuildTargetGraphicsAPIs: 317 | - m_BuildTarget: AndroidPlayer 318 | m_APIs: 150000000b000000 319 | m_Automatic: 1 320 | - m_BuildTarget: iOSSupport 321 | m_APIs: 10000000 322 | m_Automatic: 1 323 | m_BuildTargetVRSettings: [] 324 | m_DefaultShaderChunkSizeInMB: 16 325 | m_DefaultShaderChunkCount: 0 326 | openGLRequireES31: 0 327 | openGLRequireES31AEP: 0 328 | openGLRequireES32: 0 329 | m_TemplateCustomTags: {} 330 | mobileMTRendering: 331 | Android: 1 332 | iPhone: 1 333 | tvOS: 1 334 | m_BuildTargetGroupLightmapEncodingQuality: [] 335 | m_BuildTargetGroupHDRCubemapEncodingQuality: [] 336 | m_BuildTargetGroupLightmapSettings: [] 337 | m_BuildTargetGroupLoadStoreDebugModeSettings: [] 338 | m_BuildTargetNormalMapEncoding: [] 339 | m_BuildTargetDefaultTextureCompressionFormat: 340 | - m_BuildTarget: Android 341 | m_Format: 3 342 | playModeTestRunnerEnabled: 0 343 | runPlayModeTestAsEditModeTest: 0 344 | actionOnDotNetUnhandledException: 1 345 | enableInternalProfiler: 0 346 | logObjCUncaughtExceptions: 1 347 | enableCrashReportAPI: 0 348 | cameraUsageDescription: 349 | locationUsageDescription: 350 | microphoneUsageDescription: 351 | bluetoothUsageDescription: 352 | macOSTargetOSVersion: 10.13.0 353 | switchNMETAOverride: 354 | switchNetLibKey: 355 | switchSocketMemoryPoolSize: 6144 356 | switchSocketAllocatorPoolSize: 128 357 | switchSocketConcurrencyLimit: 14 358 | switchScreenResolutionBehavior: 2 359 | switchUseCPUProfiler: 0 360 | switchEnableFileSystemTrace: 0 361 | switchUseGOLDLinker: 0 362 | switchLTOSetting: 0 363 | switchApplicationID: 0x01004b9000490000 364 | switchNSODependencies: 365 | switchCompilerFlags: 366 | switchTitleNames_0: 367 | switchTitleNames_1: 368 | switchTitleNames_2: 369 | switchTitleNames_3: 370 | switchTitleNames_4: 371 | switchTitleNames_5: 372 | switchTitleNames_6: 373 | switchTitleNames_7: 374 | switchTitleNames_8: 375 | switchTitleNames_9: 376 | switchTitleNames_10: 377 | switchTitleNames_11: 378 | switchTitleNames_12: 379 | switchTitleNames_13: 380 | switchTitleNames_14: 381 | switchTitleNames_15: 382 | switchPublisherNames_0: 383 | switchPublisherNames_1: 384 | switchPublisherNames_2: 385 | switchPublisherNames_3: 386 | switchPublisherNames_4: 387 | switchPublisherNames_5: 388 | switchPublisherNames_6: 389 | switchPublisherNames_7: 390 | switchPublisherNames_8: 391 | switchPublisherNames_9: 392 | switchPublisherNames_10: 393 | switchPublisherNames_11: 394 | switchPublisherNames_12: 395 | switchPublisherNames_13: 396 | switchPublisherNames_14: 397 | switchPublisherNames_15: 398 | switchIcons_0: {fileID: 0} 399 | switchIcons_1: {fileID: 0} 400 | switchIcons_2: {fileID: 0} 401 | switchIcons_3: {fileID: 0} 402 | switchIcons_4: {fileID: 0} 403 | switchIcons_5: {fileID: 0} 404 | switchIcons_6: {fileID: 0} 405 | switchIcons_7: {fileID: 0} 406 | switchIcons_8: {fileID: 0} 407 | switchIcons_9: {fileID: 0} 408 | switchIcons_10: {fileID: 0} 409 | switchIcons_11: {fileID: 0} 410 | switchIcons_12: {fileID: 0} 411 | switchIcons_13: {fileID: 0} 412 | switchIcons_14: {fileID: 0} 413 | switchIcons_15: {fileID: 0} 414 | switchSmallIcons_0: {fileID: 0} 415 | switchSmallIcons_1: {fileID: 0} 416 | switchSmallIcons_2: {fileID: 0} 417 | switchSmallIcons_3: {fileID: 0} 418 | switchSmallIcons_4: {fileID: 0} 419 | switchSmallIcons_5: {fileID: 0} 420 | switchSmallIcons_6: {fileID: 0} 421 | switchSmallIcons_7: {fileID: 0} 422 | switchSmallIcons_8: {fileID: 0} 423 | switchSmallIcons_9: {fileID: 0} 424 | switchSmallIcons_10: {fileID: 0} 425 | switchSmallIcons_11: {fileID: 0} 426 | switchSmallIcons_12: {fileID: 0} 427 | switchSmallIcons_13: {fileID: 0} 428 | switchSmallIcons_14: {fileID: 0} 429 | switchSmallIcons_15: {fileID: 0} 430 | switchManualHTML: 431 | switchAccessibleURLs: 432 | switchLegalInformation: 433 | switchMainThreadStackSize: 1048576 434 | switchPresenceGroupId: 435 | switchLogoHandling: 0 436 | switchReleaseVersion: 0 437 | switchDisplayVersion: 1.0.0 438 | switchStartupUserAccount: 0 439 | switchSupportedLanguagesMask: 0 440 | switchLogoType: 0 441 | switchApplicationErrorCodeCategory: 442 | switchUserAccountSaveDataSize: 0 443 | switchUserAccountSaveDataJournalSize: 0 444 | switchApplicationAttribute: 0 445 | switchCardSpecSize: -1 446 | switchCardSpecClock: -1 447 | switchRatingsMask: 0 448 | switchRatingsInt_0: 0 449 | switchRatingsInt_1: 0 450 | switchRatingsInt_2: 0 451 | switchRatingsInt_3: 0 452 | switchRatingsInt_4: 0 453 | switchRatingsInt_5: 0 454 | switchRatingsInt_6: 0 455 | switchRatingsInt_7: 0 456 | switchRatingsInt_8: 0 457 | switchRatingsInt_9: 0 458 | switchRatingsInt_10: 0 459 | switchRatingsInt_11: 0 460 | switchRatingsInt_12: 0 461 | switchLocalCommunicationIds_0: 462 | switchLocalCommunicationIds_1: 463 | switchLocalCommunicationIds_2: 464 | switchLocalCommunicationIds_3: 465 | switchLocalCommunicationIds_4: 466 | switchLocalCommunicationIds_5: 467 | switchLocalCommunicationIds_6: 468 | switchLocalCommunicationIds_7: 469 | switchParentalControl: 0 470 | switchAllowsScreenshot: 1 471 | switchAllowsVideoCapturing: 1 472 | switchAllowsRuntimeAddOnContentInstall: 0 473 | switchDataLossConfirmation: 0 474 | switchUserAccountLockEnabled: 0 475 | switchSystemResourceMemory: 16777216 476 | switchSupportedNpadStyles: 22 477 | switchNativeFsCacheSize: 32 478 | switchIsHoldTypeHorizontal: 0 479 | switchSupportedNpadCount: 8 480 | switchEnableTouchScreen: 1 481 | switchSocketConfigEnabled: 0 482 | switchTcpInitialSendBufferSize: 32 483 | switchTcpInitialReceiveBufferSize: 64 484 | switchTcpAutoSendBufferSizeMax: 256 485 | switchTcpAutoReceiveBufferSizeMax: 256 486 | switchUdpSendBufferSize: 9 487 | switchUdpReceiveBufferSize: 42 488 | switchSocketBufferEfficiency: 4 489 | switchSocketInitializeEnabled: 1 490 | switchNetworkInterfaceManagerInitializeEnabled: 1 491 | switchPlayerConnectionEnabled: 1 492 | switchUseNewStyleFilepaths: 0 493 | switchUseLegacyFmodPriorities: 0 494 | switchUseMicroSleepForYield: 1 495 | switchEnableRamDiskSupport: 0 496 | switchMicroSleepForYieldTime: 25 497 | switchRamDiskSpaceSize: 12 498 | ps4NPAgeRating: 12 499 | ps4NPTitleSecret: 500 | ps4NPTrophyPackPath: 501 | ps4ParentalLevel: 11 502 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 503 | ps4Category: 0 504 | ps4MasterVersion: 01.00 505 | ps4AppVersion: 01.00 506 | ps4AppType: 0 507 | ps4ParamSfxPath: 508 | ps4VideoOutPixelFormat: 0 509 | ps4VideoOutInitialWidth: 1920 510 | ps4VideoOutBaseModeInitialWidth: 1920 511 | ps4VideoOutReprojectionRate: 60 512 | ps4PronunciationXMLPath: 513 | ps4PronunciationSIGPath: 514 | ps4BackgroundImagePath: 515 | ps4StartupImagePath: 516 | ps4StartupImagesFolder: 517 | ps4IconImagesFolder: 518 | ps4SaveDataImagePath: 519 | ps4SdkOverride: 520 | ps4BGMPath: 521 | ps4ShareFilePath: 522 | ps4ShareOverlayImagePath: 523 | ps4PrivacyGuardImagePath: 524 | ps4ExtraSceSysFile: 525 | ps4NPtitleDatPath: 526 | ps4RemotePlayKeyAssignment: -1 527 | ps4RemotePlayKeyMappingDir: 528 | ps4PlayTogetherPlayerCount: 0 529 | ps4EnterButtonAssignment: 2 530 | ps4ApplicationParam1: 0 531 | ps4ApplicationParam2: 0 532 | ps4ApplicationParam3: 0 533 | ps4ApplicationParam4: 0 534 | ps4DownloadDataSize: 0 535 | ps4GarlicHeapSize: 2048 536 | ps4ProGarlicHeapSize: 2560 537 | playerPrefsMaxSize: 32768 538 | ps4Passcode: bi9UOuSpM2Tlh01vOzwvSikHFswuzleh 539 | ps4pnSessions: 1 540 | ps4pnPresence: 1 541 | ps4pnFriends: 1 542 | ps4pnGameCustomData: 1 543 | playerPrefsSupport: 0 544 | enableApplicationExit: 0 545 | resetTempFolder: 1 546 | restrictedAudioUsageRights: 0 547 | ps4UseResolutionFallback: 0 548 | ps4ReprojectionSupport: 0 549 | ps4UseAudio3dBackend: 0 550 | ps4UseLowGarlicFragmentationMode: 1 551 | ps4SocialScreenEnabled: 0 552 | ps4ScriptOptimizationLevel: 2 553 | ps4Audio3dVirtualSpeakerCount: 14 554 | ps4attribCpuUsage: 0 555 | ps4PatchPkgPath: 556 | ps4PatchLatestPkgPath: 557 | ps4PatchChangeinfoPath: 558 | ps4PatchDayOne: 0 559 | ps4attribUserManagement: 0 560 | ps4attribMoveSupport: 0 561 | ps4attrib3DSupport: 0 562 | ps4attribShareSupport: 0 563 | ps4attribExclusiveVR: 0 564 | ps4disableAutoHideSplash: 0 565 | ps4videoRecordingFeaturesUsed: 0 566 | ps4contentSearchFeaturesUsed: 0 567 | ps4CompatibilityPS5: 0 568 | ps4AllowPS5Detection: 0 569 | ps4GPU800MHz: 1 570 | ps4attribEyeToEyeDistanceSettingVR: 0 571 | ps4IncludedModules: [] 572 | ps4attribVROutputEnabled: 0 573 | monoEnv: 574 | splashScreenBackgroundSourceLandscape: {fileID: 0} 575 | splashScreenBackgroundSourcePortrait: {fileID: 0} 576 | blurSplashScreenBackground: 1 577 | spritePackerPolicy: 578 | webGLMemorySize: 32 579 | webGLExceptionSupport: 1 580 | webGLNameFilesAsHashes: 0 581 | webGLShowDiagnostics: 0 582 | webGLDataCaching: 1 583 | webGLDebugSymbols: 0 584 | webGLEmscriptenArgs: 585 | webGLModulesDirectory: 586 | webGLTemplate: APPLICATION:Default 587 | webGLAnalyzeBuildSize: 0 588 | webGLUseEmbeddedResources: 0 589 | webGLCompressionFormat: 0 590 | webGLWasmArithmeticExceptions: 0 591 | webGLLinkerTarget: 1 592 | webGLThreadsSupport: 0 593 | webGLDecompressionFallback: 0 594 | webGLInitialMemorySize: 32 595 | webGLMaximumMemorySize: 2048 596 | webGLMemoryGrowthMode: 2 597 | webGLMemoryLinearGrowthStep: 16 598 | webGLMemoryGeometricGrowthStep: 0.2 599 | webGLMemoryGeometricGrowthCap: 96 600 | webGLPowerPreference: 2 601 | scriptingDefineSymbols: {} 602 | additionalCompilerArguments: {} 603 | platformArchitecture: {} 604 | scriptingBackend: {} 605 | il2cppCompilerConfiguration: {} 606 | il2cppCodeGeneration: {} 607 | managedStrippingLevel: 608 | EmbeddedLinux: 1 609 | GameCoreScarlett: 1 610 | GameCoreXboxOne: 1 611 | Nintendo Switch: 1 612 | PS4: 1 613 | PS5: 1 614 | QNX: 1 615 | Stadia: 1 616 | VisionOS: 1 617 | WebGL: 1 618 | Windows Store Apps: 1 619 | XboxOne: 1 620 | iPhone: 1 621 | tvOS: 1 622 | incrementalIl2cppBuild: {} 623 | suppressCommonWarnings: 1 624 | allowUnsafeCode: 0 625 | useDeterministicCompilation: 1 626 | additionalIl2CppArgs: 627 | scriptingRuntimeVersion: 1 628 | gcIncremental: 1 629 | gcWBarrierValidation: 0 630 | apiCompatibilityLevelPerPlatform: {} 631 | m_RenderingPath: 1 632 | m_MobileRenderingPath: 1 633 | metroPackageName: UniAquarium 634 | metroPackageVersion: 635 | metroCertificatePath: 636 | metroCertificatePassword: 637 | metroCertificateSubject: 638 | metroCertificateIssuer: 639 | metroCertificateNotAfter: 0000000000000000 640 | metroApplicationDescription: UniAquarium 641 | wsaImages: {} 642 | metroTileShortName: 643 | metroTileShowName: 0 644 | metroMediumTileShowName: 0 645 | metroLargeTileShowName: 0 646 | metroWideTileShowName: 0 647 | metroSupportStreamingInstall: 0 648 | metroLastRequiredScene: 0 649 | metroDefaultTileSize: 1 650 | metroTileForegroundText: 2 651 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 652 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} 653 | metroSplashScreenUseBackgroundColor: 0 654 | platformCapabilities: {} 655 | metroTargetDeviceFamilies: {} 656 | metroFTAName: 657 | metroFTAFileTypes: [] 658 | metroProtocolName: 659 | vcxProjDefaultLanguage: 660 | XboxOneProductId: 661 | XboxOneUpdateKey: 662 | XboxOneSandboxId: 663 | XboxOneContentId: 664 | XboxOneTitleId: 665 | XboxOneSCId: 666 | XboxOneGameOsOverridePath: 667 | XboxOnePackagingOverridePath: 668 | XboxOneAppManifestOverridePath: 669 | XboxOneVersion: 1.0.0.0 670 | XboxOnePackageEncryption: 0 671 | XboxOnePackageUpdateGranularity: 2 672 | XboxOneDescription: 673 | XboxOneLanguage: 674 | - enus 675 | XboxOneCapability: [] 676 | XboxOneGameRating: {} 677 | XboxOneIsContentPackage: 0 678 | XboxOneEnhancedXboxCompatibilityMode: 0 679 | XboxOneEnableGPUVariability: 1 680 | XboxOneSockets: {} 681 | XboxOneSplashScreen: {fileID: 0} 682 | XboxOneAllowedProductIds: [] 683 | XboxOnePersistentLocalStorageSize: 0 684 | XboxOneXTitleMemory: 8 685 | XboxOneOverrideIdentityName: 686 | XboxOneOverrideIdentityPublisher: 687 | vrEditorSettings: {} 688 | cloudServicesEnabled: {} 689 | luminIcon: 690 | m_Name: 691 | m_ModelFolderPath: 692 | m_PortalFolderPath: 693 | luminCert: 694 | m_CertPath: 695 | m_SignPackage: 1 696 | luminIsChannelApp: 0 697 | luminVersion: 698 | m_VersionCode: 1 699 | m_VersionName: 700 | hmiPlayerDataPath: 701 | hmiForceSRGBBlit: 1 702 | embeddedLinuxEnableGamepadInput: 1 703 | hmiLogStartupTiming: 0 704 | hmiCpuConfiguration: 705 | apiCompatibilityLevel: 6 706 | activeInputHandler: 0 707 | windowsGamepadBackendHint: 0 708 | cloudProjectId: 709 | framebufferDepthMemorylessMode: 0 710 | qualitySettingsNames: [] 711 | projectName: 712 | organizationId: 713 | cloudEnabled: 0 714 | legacyClampBlendShapeWeights: 0 715 | hmiLoadingImage: {fileID: 0} 716 | platformRequiresReadableAssets: 0 717 | virtualTexturingSupportEnabled: 0 718 | insecureHttpOption: 0 719 | --------------------------------------------------------------------------------