From b1f2446fa6ab3401a387714b60f1191a43f2c6be Mon Sep 17 00:00:00 2001 From: Stedd Date: Sat, 1 Oct 2022 21:42:18 +0200 Subject: [PATCH] Added Targeting for entities *Changed all Runtime Sets to be instead of or *Added targeting configuration scriptable object (can now set up many differet targeting schemes and use them as needed) *Added targeting script *Modified Turret and Enemy to use targeting script (added on play) *Added NavMesh and NavMeshAgents for enemy movement to be used during prototyping --- Assets/Entities/Enemies/Enemy.prefab | 8 +- .../Enemies/EnemyTargeterConfiguration.asset | 17 + .../EnemyTargeterConfiguration.asset.meta} | 2 +- Assets/Entities/Enemies/Scripts/EnemyBase.cs | 36 +- ...nemies.asset => ActiveEnemyEntities.asset} | 4 +- ...et.meta => ActiveEnemyEntities.asset.meta} | 2 +- ...es.asset => ActiveStructureEntities.asset} | 4 +- .../ActiveStructureEntities.asset.meta | 8 + .../ScriptableObjects/STargeterConfig.cs | 18 + .../ScriptableObjects/STargeterConfig.cs.meta | 11 + .../Structures/PowerPlant/PowerPlant.prefab | 2 +- .../Structures/Scripts/StructureBase.cs | 2 +- .../Structures/StructureDisabler.prefab | 47 +++ .../Structures/StructureDisabler.prefab.meta | 7 + Assets/Entities/Structures/Turret/Turret.cs | 102 +----- .../Entities/Structures/Turret/Turret.prefab | 6 +- .../TurretStandardTargeterConfiguration.asset | 17 + ...etStandardTargeterConfiguration.asset.meta | 8 + Assets/Entities/Targeter.cs | 75 +++++ Assets/Entities/Targeter.cs.meta | 11 + .../Playground 1.meta} | 2 +- Assets/Scenes/Playground 1.unity | 310 +++++++++++++++--- Assets/Scenes/Playground 1/NavMesh.asset | Bin 0 -> 9668 bytes Assets/Scenes/Playground 1/NavMesh.asset.meta | 8 + 24 files changed, 560 insertions(+), 147 deletions(-) create mode 100644 Assets/Entities/Enemies/EnemyTargeterConfiguration.asset rename Assets/Entities/{RuntimeSet/ActiveEnemies.asset.meta => Enemies/EnemyTargeterConfiguration.asset.meta} (79%) rename Assets/Entities/RuntimeSet/{ActiveEnemies.asset => ActiveEnemyEntities.asset} (73%) rename Assets/Entities/RuntimeSet/{ActiveStructures.asset.meta => ActiveEnemyEntities.asset.meta} (79%) rename Assets/Entities/RuntimeSet/{ActiveStructures.asset => ActiveStructureEntities.asset} (73%) create mode 100644 Assets/Entities/RuntimeSet/ActiveStructureEntities.asset.meta create mode 100644 Assets/Entities/ScriptableObjects/STargeterConfig.cs create mode 100644 Assets/Entities/ScriptableObjects/STargeterConfig.cs.meta create mode 100644 Assets/Entities/Structures/StructureDisabler.prefab create mode 100644 Assets/Entities/Structures/StructureDisabler.prefab.meta create mode 100644 Assets/Entities/Structures/Turret/TurretStandardTargeterConfiguration.asset create mode 100644 Assets/Entities/Structures/Turret/TurretStandardTargeterConfiguration.asset.meta create mode 100644 Assets/Entities/Targeter.cs create mode 100644 Assets/Entities/Targeter.cs.meta rename Assets/{Scripts/ScriptableObjects.meta => Scenes/Playground 1.meta} (77%) create mode 100644 Assets/Scenes/Playground 1/NavMesh.asset create mode 100644 Assets/Scenes/Playground 1/NavMesh.asset.meta diff --git a/Assets/Entities/Enemies/Enemy.prefab b/Assets/Entities/Enemies/Enemy.prefab index d35f538..afdef29 100644 --- a/Assets/Entities/Enemies/Enemy.prefab +++ b/Assets/Entities/Enemies/Enemy.prefab @@ -413,7 +413,11 @@ MonoBehaviour: _basePosition: {fileID: 2692714622321691895} _uiFriendlyName: Enemy _entityBaseSet: {fileID: 11400000, guid: c5542e77624472441a67b1f34e19a116, type: 2} - _enemyBaseSet: {fileID: 11400000, guid: 5f6dc84d75dbd9a459e519de42279066, type: 2} + _enemyBaseSet: {fileID: 11400000, guid: e5f25127d92be074aac6e7b745fae107, type: 2} + _targeterConfig: {fileID: 11400000, guid: d5813a38da3962d4498fc71ef33361b6, type: 2} + _targeter: {fileID: 0} + _target: {fileID: 0} + _navMeshAgent: {fileID: 0} --- !u!1 &6940800288144322101 GameObject: m_ObjectHideFlags: 0 @@ -437,7 +441,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6940800288144322101} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: 0, y: -0.7071068, z: 0, w: 0.7071068} m_LocalPosition: {x: 0, y: 2.01, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 diff --git a/Assets/Entities/Enemies/EnemyTargeterConfiguration.asset b/Assets/Entities/Enemies/EnemyTargeterConfiguration.asset new file mode 100644 index 0000000..92129b5 --- /dev/null +++ b/Assets/Entities/Enemies/EnemyTargeterConfiguration.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02781660543c12d4ebddaf334eb0d730, type: 3} + m_Name: EnemyTargeterConfiguration + m_EditorClassIdentifier: + _range: 0 + _selectedTargetStrategy: 0 + _activeEntities: {fileID: 0} diff --git a/Assets/Entities/RuntimeSet/ActiveEnemies.asset.meta b/Assets/Entities/Enemies/EnemyTargeterConfiguration.asset.meta similarity index 79% rename from Assets/Entities/RuntimeSet/ActiveEnemies.asset.meta rename to Assets/Entities/Enemies/EnemyTargeterConfiguration.asset.meta index eae21c2..ab514ec 100644 --- a/Assets/Entities/RuntimeSet/ActiveEnemies.asset.meta +++ b/Assets/Entities/Enemies/EnemyTargeterConfiguration.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5f6dc84d75dbd9a459e519de42279066 +guid: d5813a38da3962d4498fc71ef33361b6 NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Assets/Entities/Enemies/Scripts/EnemyBase.cs b/Assets/Entities/Enemies/Scripts/EnemyBase.cs index eefb416..e6fdd79 100644 --- a/Assets/Entities/Enemies/Scripts/EnemyBase.cs +++ b/Assets/Entities/Enemies/Scripts/EnemyBase.cs @@ -1,15 +1,40 @@ +using System; using UnityEngine; +using UnityEngine.AI; namespace AsteroidGame.Entities { public class EnemyBase : EntityBase { - [SerializeField] private SEnemyBaseRuntimeSet _enemyBaseSet; + [SerializeField] private SEntityBaseRuntimeSet _enemyBaseSet; + + [Header("Targeter")] + [SerializeField] private STargeterConfig _targeterConfig; + [SerializeField] private Targeter _targeter; + [SerializeField] private EntityBase _target; + + [Header("NavMeshAgent")] + [SerializeField] private NavMeshAgent _navMeshAgent; protected override void OnEnable() { base.OnEnable(); _enemyBaseSet.Add(this); + InitializeTargeter(); + InitializeNavMeshAgent(); + } + + private void InitializeNavMeshAgent() + { + _navMeshAgent = gameObject.AddComponent(); + _navMeshAgent.speed = 0.1f; + } + + private void InitializeTargeter() + { + _targeter = gameObject.AddComponent(); + _targeter.SetParent(this); + _targeter.SetConfig(_targeterConfig); } protected override void OnDisable() @@ -17,5 +42,14 @@ namespace AsteroidGame.Entities base.OnDisable(); _enemyBaseSet.Remove(this); } + + private void Update() + { + if (_targeter.FoundTarget()) + { + _target = _targeter.GetTarget(); + _navMeshAgent.SetDestination(_target.GetBasePosition()); + } + } } } \ No newline at end of file diff --git a/Assets/Entities/RuntimeSet/ActiveEnemies.asset b/Assets/Entities/RuntimeSet/ActiveEnemyEntities.asset similarity index 73% rename from Assets/Entities/RuntimeSet/ActiveEnemies.asset rename to Assets/Entities/RuntimeSet/ActiveEnemyEntities.asset index 44a21e5..4a341a8 100644 --- a/Assets/Entities/RuntimeSet/ActiveEnemies.asset +++ b/Assets/Entities/RuntimeSet/ActiveEnemyEntities.asset @@ -9,7 +9,7 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 33f48df2d03212c4986fe2c47c5de796, type: 3} - m_Name: ActiveEnemies + m_Script: {fileID: 11500000, guid: 9da2d6a0206101c47a22881a0ba2ece2, type: 3} + m_Name: ActiveEnemyEntities m_EditorClassIdentifier: _list: [] diff --git a/Assets/Entities/RuntimeSet/ActiveStructures.asset.meta b/Assets/Entities/RuntimeSet/ActiveEnemyEntities.asset.meta similarity index 79% rename from Assets/Entities/RuntimeSet/ActiveStructures.asset.meta rename to Assets/Entities/RuntimeSet/ActiveEnemyEntities.asset.meta index 96c0c99..05f995a 100644 --- a/Assets/Entities/RuntimeSet/ActiveStructures.asset.meta +++ b/Assets/Entities/RuntimeSet/ActiveEnemyEntities.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: bccdf438a1004a444bc24492728d6fbd +guid: e5f25127d92be074aac6e7b745fae107 NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Assets/Entities/RuntimeSet/ActiveStructures.asset b/Assets/Entities/RuntimeSet/ActiveStructureEntities.asset similarity index 73% rename from Assets/Entities/RuntimeSet/ActiveStructures.asset rename to Assets/Entities/RuntimeSet/ActiveStructureEntities.asset index 1d21fdd..7ef2ebd 100644 --- a/Assets/Entities/RuntimeSet/ActiveStructures.asset +++ b/Assets/Entities/RuntimeSet/ActiveStructureEntities.asset @@ -9,7 +9,7 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fbc6f67c9903cc8448f793da64d840cf, type: 3} - m_Name: ActiveStructures + m_Script: {fileID: 11500000, guid: 9da2d6a0206101c47a22881a0ba2ece2, type: 3} + m_Name: ActiveStructureEntities m_EditorClassIdentifier: _list: [] diff --git a/Assets/Entities/RuntimeSet/ActiveStructureEntities.asset.meta b/Assets/Entities/RuntimeSet/ActiveStructureEntities.asset.meta new file mode 100644 index 0000000..904adc8 --- /dev/null +++ b/Assets/Entities/RuntimeSet/ActiveStructureEntities.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1925957d2bc2f0c4a9210131f2d2c4e5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Entities/ScriptableObjects/STargeterConfig.cs b/Assets/Entities/ScriptableObjects/STargeterConfig.cs new file mode 100644 index 0000000..461c31f --- /dev/null +++ b/Assets/Entities/ScriptableObjects/STargeterConfig.cs @@ -0,0 +1,18 @@ +using AsteroidGame.Interfaces; +using UnityEngine; + +namespace AsteroidGame.Entities +{ + [CreateAssetMenu(fileName = "newTargeterConfiguration", menuName = "Configuration/Targeter")] + public class STargeterConfig : ScriptableObject + { + public float _range; + public TargetStrategy _selectedTargetStrategy; + public SEntityBaseRuntimeSet _activeEntities; + public enum TargetStrategy + { + LowestRange, + LowestHealth + }; + } +} \ No newline at end of file diff --git a/Assets/Entities/ScriptableObjects/STargeterConfig.cs.meta b/Assets/Entities/ScriptableObjects/STargeterConfig.cs.meta new file mode 100644 index 0000000..5c2f0bb --- /dev/null +++ b/Assets/Entities/ScriptableObjects/STargeterConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 02781660543c12d4ebddaf334eb0d730 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Entities/Structures/PowerPlant/PowerPlant.prefab b/Assets/Entities/Structures/PowerPlant/PowerPlant.prefab index a56e5fc..05a48e5 100644 --- a/Assets/Entities/Structures/PowerPlant/PowerPlant.prefab +++ b/Assets/Entities/Structures/PowerPlant/PowerPlant.prefab @@ -60,7 +60,7 @@ MonoBehaviour: _isConsumer: 0 _maxPower: 100 _currentPower: 0 - _structureBaseSet: {fileID: 11400000, guid: bccdf438a1004a444bc24492728d6fbd, type: 2} + _structureBaseSet: {fileID: 11400000, guid: 1925957d2bc2f0c4a9210131f2d2c4e5, type: 2} --- !u!1 &1863277996181035512 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Entities/Structures/Scripts/StructureBase.cs b/Assets/Entities/Structures/Scripts/StructureBase.cs index 9552528..a55c5af 100644 --- a/Assets/Entities/Structures/Scripts/StructureBase.cs +++ b/Assets/Entities/Structures/Scripts/StructureBase.cs @@ -18,7 +18,7 @@ namespace AsteroidGame.Entities [SerializeField] protected int _currentPower; [Header("Configuration")] - [SerializeField] private SStructureBaseRuntimeSet _structureBaseSet; + [SerializeField] private SEntityBaseRuntimeSet _structureBaseSet; #region Private diff --git a/Assets/Entities/Structures/StructureDisabler.prefab b/Assets/Entities/Structures/StructureDisabler.prefab new file mode 100644 index 0000000..16626d8 --- /dev/null +++ b/Assets/Entities/Structures/StructureDisabler.prefab @@ -0,0 +1,47 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2187298781219062666 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2187298781219062668} + - component: {fileID: 2187298781219062669} + m_Layer: 0 + m_Name: StructureDisabler + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2187298781219062668 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2187298781219062666} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.8230318, y: 5.3787107, z: -4.0428505} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2187298781219062669 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2187298781219062666} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f60f8a4b6b214b04083229f46bf1170b, type: 3} + m_Name: + m_EditorClassIdentifier: + _set: {fileID: 11400000, guid: bccdf438a1004a444bc24492728d6fbd, type: 2} diff --git a/Assets/Entities/Structures/StructureDisabler.prefab.meta b/Assets/Entities/Structures/StructureDisabler.prefab.meta new file mode 100644 index 0000000..015938f --- /dev/null +++ b/Assets/Entities/Structures/StructureDisabler.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 14893e62c82e47e4d886fdac849f9302 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Entities/Structures/Turret/Turret.cs b/Assets/Entities/Structures/Turret/Turret.cs index 4f28fae..bd57a4c 100644 --- a/Assets/Entities/Structures/Turret/Turret.cs +++ b/Assets/Entities/Structures/Turret/Turret.cs @@ -6,13 +6,10 @@ namespace AsteroidGame.Entities { public class Turret : StructureBase { - [Header("WeaponParameters")] [SerializeField] - private float _weaponRange = 40f; - + [Header("WeaponParameters")] [SerializeField] private int _damage = 1; [SerializeField] private float _fireRate = 1; [SerializeField] private float _projectileSpeed = 5; - [SerializeField] private TargetStrategy _targetStrategy = TargetStrategy.LowestHealth; [Header("Stats")] [SerializeField] private float _kills = 0f; @@ -22,103 +19,40 @@ namespace AsteroidGame.Entities [SerializeField] private Transform _turretHead; [SerializeField] private Transform _barrel; - [Header("Target")] - [SerializeField] private SEnemyBaseRuntimeSet _activeEnemies; - [SerializeField] private EnemyBase _targetEnemy; - - [SerializeField] private enum TargetStrategy - { - ClosestEnemy, - LowestHealth - }; + [Header("Targeter")] + [SerializeField] private STargeterConfig _targeterConfig; + [SerializeField] private Targeter _targeter; + [SerializeField] private EntityBase _target; #region Publics - public float MaxDistance { get; set; } - public int Damage { get => _damage; set => _damage = value; } - public int FireRate { get; set; } - #endregion - private void Start() + protected override void OnEnable() { - // enemyHandler = FindObjectOfType(); - // scoreHandler = FindObjectOfType(); - UpdateWeaponParameters(_fireRate, _projectileSpeed); + base.OnEnable(); + InitializeTargeter(); + } + + private void InitializeTargeter() + { + _targeter = gameObject.AddComponent(); + _targeter.SetParent(this); + _targeter.SetConfig(_targeterConfig); } private void Update() { - FindEnemyTarget(); - } - - private void UpdateWeaponParameters(float fireRate, float projectileSpeed) - { - // var main = _projectile.main; - // main.startSpeed = _projectileSpeed; - // - // var emission = _projectile.emission; - // emission.rateOverTime = _fireRate; - } - - // Update is called once per frame - - private void FindEnemyTarget() - { - float currentBestValue = Mathf.Infinity; - var targetFound = false; - - foreach (EnemyBase enemy in _activeEnemies._list) + if (_targeter.FoundTarget()) { - float distanceToTarget = Vector3.Magnitude(enemy.GetCenterPosition() - GetCenterPosition()); - - bool withinRange = distanceToTarget < _weaponRange; - if (withinRange) - { - switch (_targetStrategy) - { - case TargetStrategy.ClosestEnemy: - { - bool isClosest = distanceToTarget < currentBestValue; - if (isClosest) - { - targetFound = true; - currentBestValue = distanceToTarget; - _targetEnemy = enemy; - } - - break; - } - case TargetStrategy.LowestHealth: - { - float enemyHealth = enemy.GetHealth(); - - bool isLowestHealth = enemyHealth < currentBestValue; - if (isLowestHealth) - { - targetFound = true; - currentBestValue = enemyHealth; - _targetEnemy = enemy; - } - - break; - } - default: - throw new ArgumentOutOfRangeException(); - } - } - } - - if (targetFound) - { - _turretHead.transform.LookAt(_targetEnemy.GetCenterPosition()); - // ShootProjectile(true); + _target = _targeter.GetTarget(); + _turretHead.transform.LookAt(_target.GetCenterPosition()); } } } diff --git a/Assets/Entities/Structures/Turret/Turret.prefab b/Assets/Entities/Structures/Turret/Turret.prefab index 930a503..0132361 100644 --- a/Assets/Entities/Structures/Turret/Turret.prefab +++ b/Assets/Entities/Structures/Turret/Turret.prefab @@ -756,15 +756,15 @@ MonoBehaviour: _isConsumer: 1 _maxPower: 10 _currentPower: 0 - _structureBaseSet: {fileID: 11400000, guid: bccdf438a1004a444bc24492728d6fbd, type: 2} + _structureBaseSet: {fileID: 11400000, guid: 1925957d2bc2f0c4a9210131f2d2c4e5, type: 2} _weaponRange: 10 _damage: 1 _fireRate: 1 _projectileSpeed: 5 - _targetStrategy: 1 _kills: 0 _damageDealt: 0 _turretHead: {fileID: 5103935544653627402} _barrel: {fileID: 5103935545559248087} - _activeEnemies: {fileID: 11400000, guid: 5f6dc84d75dbd9a459e519de42279066, type: 2} + _targeterConfig: {fileID: 11400000, guid: 9df40bc219ab8f04cb4e86558bc0df86, type: 2} + _targeter: {fileID: 0} _targetEnemy: {fileID: 0} diff --git a/Assets/Entities/Structures/Turret/TurretStandardTargeterConfiguration.asset b/Assets/Entities/Structures/Turret/TurretStandardTargeterConfiguration.asset new file mode 100644 index 0000000..e30cd39 --- /dev/null +++ b/Assets/Entities/Structures/Turret/TurretStandardTargeterConfiguration.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02781660543c12d4ebddaf334eb0d730, type: 3} + m_Name: TurretStandardTargeterConfiguration + m_EditorClassIdentifier: + _range: 15 + _selectedTargetStrategy: 0 + _activeEntities: {fileID: 11400000, guid: e5f25127d92be074aac6e7b745fae107, type: 2} diff --git a/Assets/Entities/Structures/Turret/TurretStandardTargeterConfiguration.asset.meta b/Assets/Entities/Structures/Turret/TurretStandardTargeterConfiguration.asset.meta new file mode 100644 index 0000000..6375311 --- /dev/null +++ b/Assets/Entities/Structures/Turret/TurretStandardTargeterConfiguration.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9df40bc219ab8f04cb4e86558bc0df86 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Entities/Targeter.cs b/Assets/Entities/Targeter.cs new file mode 100644 index 0000000..2885c8d --- /dev/null +++ b/Assets/Entities/Targeter.cs @@ -0,0 +1,75 @@ +using UnityEngine; + +namespace AsteroidGame.Entities +{ + public class Targeter : MonoBehaviour + { + [SerializeField] private float _range; + [SerializeField] private STargeterConfig.TargetStrategy _targetStrategy; + [SerializeField] private SEntityBaseRuntimeSet _activeEntities; + [SerializeField] private EntityBase _targeterParent; + [SerializeField] private EntityBase _targetEntity; + + public void SetParent(EntityBase newParent) => _targeterParent = newParent; + + public void SetConfig(STargeterConfig config) + { + _range = config._range; + _targetStrategy = config._selectedTargetStrategy; + _activeEntities = config._activeEntities; + } + + public EntityBase GetTarget() + { + return _targetEntity; + } + + public bool FoundTarget() + { + float currentBestValue = Mathf.Infinity; + var targetFound = false; + + foreach (EntityBase targetEntity in _activeEntities._list) + { + float distanceToTarget = + Vector3.Magnitude(targetEntity.GetCenterPosition() - _targeterParent.GetCenterPosition()); + + bool withinRange = distanceToTarget < _range; + if (withinRange) + { + switch (_targetStrategy) + { + case STargeterConfig.TargetStrategy.LowestRange: + { + bool isClosest = distanceToTarget < currentBestValue; + if (isClosest) + { + targetFound = true; + currentBestValue = distanceToTarget; + _targetEntity = targetEntity; + } + + break; + } + case STargeterConfig.TargetStrategy.LowestHealth: + { + float enemyHealth = targetEntity.GetHealth(); + + bool isLowestHealth = enemyHealth < currentBestValue; + if (isLowestHealth) + { + targetFound = true; + currentBestValue = enemyHealth; + _targetEntity = targetEntity; + } + + break; + } + } + } + } + + return targetFound; + } + } +} \ No newline at end of file diff --git a/Assets/Entities/Targeter.cs.meta b/Assets/Entities/Targeter.cs.meta new file mode 100644 index 0000000..c6802f6 --- /dev/null +++ b/Assets/Entities/Targeter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 28bcd65de1e3cf744a3ac9b53c030319 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ScriptableObjects.meta b/Assets/Scenes/Playground 1.meta similarity index 77% rename from Assets/Scripts/ScriptableObjects.meta rename to Assets/Scenes/Playground 1.meta index de84a41..c92ce6b 100644 --- a/Assets/Scripts/ScriptableObjects.meta +++ b/Assets/Scenes/Playground 1.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 624b0cf4f0dd38a459121c046c909786 +guid: c3359f2750b233549861a0b0a52b3224 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Scenes/Playground 1.unity b/Assets/Scenes/Playground 1.unity index 283531a..4802c2e 100644 --- a/Assets/Scenes/Playground 1.unity +++ b/Assets/Scenes/Playground 1.unity @@ -122,7 +122,7 @@ NavMeshSettings: preserveTilesOutsideBounds: 0 debug: m_Flags: 0 - m_NavMeshData: {fileID: 0} + m_NavMeshData: {fileID: 23800000, guid: b015bab8bed002c438c2a5abb0deec18, type: 2} --- !u!1 &38176945 GameObject: m_ObjectHideFlags: 0 @@ -271,56 +271,16 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &208658293 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 5599539567497807159, guid: 4af571b983b23f94f8d5ca4dbda27de5, type: 3} + m_PrefabInstance: {fileID: 1715656625} + m_PrefabAsset: {fileID: 0} --- !u!4 &624469242 stripped Transform: m_CorrespondingSourceObject: {fileID: 5263199550015624126, guid: 2e352ad6389b4234083764d15d4e6a5f, type: 3} m_PrefabInstance: {fileID: 5263199549561108292} m_PrefabAsset: {fileID: 0} ---- !u!1 &732841883 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 732841885} - - component: {fileID: 732841884} - m_Layer: 0 - m_Name: Disabler - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &732841884 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 732841883} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f60f8a4b6b214b04083229f46bf1170b, type: 3} - m_Name: - m_EditorClassIdentifier: - _set: {fileID: 11400000, guid: bccdf438a1004a444bc24492728d6fbd, type: 2} ---- !u!4 &732841885 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 732841883} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1.8230318, y: 5.3787107, z: -4.0428505} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!4 &991542217 stripped Transform: m_CorrespondingSourceObject: {fileID: 493861824998956378, guid: 57a75520298c47140a928041b05d7f3c, type: 3} @@ -331,6 +291,103 @@ Transform: m_CorrespondingSourceObject: {fileID: 5200388201450229074, guid: 07826307af1971948b98dd42d1e9457a, type: 3} m_PrefabInstance: {fileID: 5200388200885062254} m_PrefabAsset: {fileID: 0} +--- !u!1 &1089364665 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1089364666} + - component: {fileID: 1089364669} + - component: {fileID: 1089364668} + - component: {fileID: 1089364667} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &1089364666 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089364665} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -11.3755, y: 1.3935, z: 3.9827} + m_LocalScale: {x: 6.1543775, y: 3.7869, z: 5.7455} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1702078697} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1089364667 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089364665} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1089364668 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089364665} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 257 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1089364669 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089364665} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!4 &1158682046 stripped Transform: m_CorrespondingSourceObject: {fileID: 664620742648054780, guid: 3a89f87af6ee84a459d98a4c296dd1be, type: 3} @@ -393,6 +450,104 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: c2b4fe01faa847f4b976b5539477e1ec, type: 3} +--- !u!1 &1402420031 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1402420032} + - component: {fileID: 1402420035} + - component: {fileID: 1402420034} + - component: {fileID: 1402420033} + m_Layer: 0 + m_Name: Plane + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!4 &1402420032 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402420031} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 5.32, y: 5.32, z: 5.32} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1702078697} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1402420033 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402420031} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1402420034 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402420031} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 257 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1402420035 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402420031} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} --- !u!1001 &1421503443 PrefabInstance: m_ObjectHideFlags: 0 @@ -521,6 +676,39 @@ Transform: m_CorrespondingSourceObject: {fileID: 2692714622321691895, guid: 4af571b983b23f94f8d5ca4dbda27de5, type: 3} m_PrefabInstance: {fileID: 1494435108} m_PrefabAsset: {fileID: 0} +--- !u!1 &1702078696 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1702078697} + m_Layer: 0 + m_Name: Environment + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1702078697 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1702078696} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1402420032} + - {fileID: 1089364666} + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1715656625 PrefabInstance: m_ObjectHideFlags: 0 @@ -528,13 +716,17 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 157782261} m_Modifications: + - target: {fileID: 1411216412654489461, guid: 4af571b983b23f94f8d5ca4dbda27de5, type: 3} + propertyPath: _entityBaseSet + value: + objectReference: {fileID: 11400000, guid: e5f25127d92be074aac6e7b745fae107, type: 2} - target: {fileID: 2692714622321691895, guid: 4af571b983b23f94f8d5ca4dbda27de5, type: 3} propertyPath: m_RootOrder value: 1 objectReference: {fileID: 0} - target: {fileID: 2692714622321691895, guid: 4af571b983b23f94f8d5ca4dbda27de5, type: 3} propertyPath: m_LocalPosition.x - value: -6.3 + value: -1.8 objectReference: {fileID: 0} - target: {fileID: 2692714622321691895, guid: 4af571b983b23f94f8d5ca4dbda27de5, type: 3} propertyPath: m_LocalPosition.y @@ -542,7 +734,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2692714622321691895, guid: 4af571b983b23f94f8d5ca4dbda27de5, type: 3} propertyPath: m_LocalPosition.z - value: 11.95 + value: 2.38 objectReference: {fileID: 0} - target: {fileID: 2692714622321691895, guid: 4af571b983b23f94f8d5ca4dbda27de5, type: 3} propertyPath: m_LocalRotation.w @@ -583,6 +775,28 @@ Transform: m_CorrespondingSourceObject: {fileID: 2692714622321691895, guid: 4af571b983b23f94f8d5ca4dbda27de5, type: 3} m_PrefabInstance: {fileID: 1715656625} m_PrefabAsset: {fileID: 0} +--- !u!195 &1715656628 +NavMeshAgent: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 208658293} + m_Enabled: 1 + m_AgentTypeID: 0 + m_Radius: 0.5 + m_Speed: 3.5 + m_Acceleration: 8 + avoidancePriority: 50 + m_AngularSpeed: 120 + m_StoppingDistance: 0 + m_AutoTraverseOffMeshLink: 1 + m_AutoBraking: 1 + m_AutoRepath: 1 + m_Height: 2 + m_BaseOffset: 0 + m_WalkableMask: 4294967295 + m_ObstacleAvoidanceType: 4 --- !u!1 &2047541735 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/Playground 1/NavMesh.asset b/Assets/Scenes/Playground 1/NavMesh.asset new file mode 100644 index 0000000000000000000000000000000000000000..20b87cb3c0a7e570451f8707e04137697aea6ac1 GIT binary patch literal 9668 zcmbuEZH!!18OP7;&P-o`cDJzQwe46fAax6~<)v7lGwl|;m9|^jU8=lnr@Ob?p*u6{ z%xq~<G_Vx>wY2cp3}6cFN^V%Ig7Rf(9`~Myt{p5 zF17pbg1&oJDSbu#casO$@&hQ-Kkcs|_k#*4leYekKt+CWjAtU_zl6Mi%%zmcM#kR* zebj%}Jd5$^__ zzbb)$-|s-#iaz`wtw)Jr}dzgG=jrJg8zek^9J8;`zt( z4d9z9=gBM&gFcbc8B&GU_C6W3^zr_DL^ z?*QuX?zqG99CAr1ld3|8X`=O3ygqwclT#f<79*PV*RS>;1KZ z+;@%f();UM&Oh(bD39J>JIM>kTx!3+J`H`;f7Z?){d4~AvOI@eQpzlf%-=4kqw^zN z=Wllc*ZJEM<8nWra^o8$_mR1T`AK2Vx4uvILch@X?k3m9c2q*!cVqobeg5JcnEo?LUY1y1s{@j>bp0#^;^{uJJh#XzHaP`mc)M)<~+4Jl7@XwW6 zwj7yD+@Cz({^&U3*cLxIzy1Wy^Xn+N?;7LP{{1~cUI_E({ZJtfFxq#T_h4J+uNvcW zKP>5#{Zq3%*RsI#H#~on30&j%xdg89tH-$b?{@y>J3NP4lG^<@p^nC1`ltS<61e(5 z7UO9iU?mz}5fb zF`hE#@cpnC@nPJ)9OLqRt>^n!61e(5nZVWmR}=Vs@Xz(}wHQbLFh37~^Zt1v#-siF zdIHz}J(<9@e^14D%APM}*S~LA9%Q>q$98#*BmJdj$qWuQ>$hzmD>rNP?Z=y5wNb8B z?=Y2-JIfQ^KtF`RQu7D|TW_%L9WEUjs5Y9V>Zr$R&eVR?ZkSNP+OCYW+*C$(lp06O zp%YE7aqkWHJ0Y(^p9&jQxKV|hRJd7%TU6Mj!mTRg1JfRLa%6y>U!JvF?>jrBt0NO>FZfCiayd_ROdX zqG!~tzNtcKbabj-YI=hcrBSbfp2EWMowY;v)apmQdc#cCy@ppm=Gpn$Gu3RA$Gokz zsp?p3^6Y5)y+c#utw@Zq#3eCNvT>3AS4xu&(-Q4`Pu3dcCc2IT@q~HUG`)JgRIa+E zAXT{_uu_78qr+akSsn$cj0{xAoaA~|8QF%Bcy%zlL@}t5-L{%%d{7){!@FC>%aW z9lr6cfJ}XBnVwmz!~XS$Z8ElRxIOWO`D{>a0qNT?s^ere9VhK(@klRZ%q%nMI5E~@ zc$`9YZ08F)&Y9_sqRPgcj>$4+wjS6-IRlAfWlH-UKI6+o9s84k6zDp9?W1x=C5>84 zh#zxiwms)ANa7`&OU(}3B4v77Z~6$wnKshql#TO0-P%Z-ye*5pfd9M2do5T0+Fr+^ z`uX19!vfWL(m7(iZag{n#>?<;p=Z^>GR`moG8?7>^Z@1gFwg34I8 z81GMKsSnFqN5;jq&BQ)uiaIXJLEKIkS7Q}q%o=kQYF=P>tT9U{P3&YC@TJ%-O!)$5yMpN}W$ zwVl4(>wQ>R+v&T#KF4Fsv-n+k%KR1wv6izazY{6B|Tz4uh+y~n#! z@5!0zr3I;D(5~R*#gG>lrOsK{{J`pQx8n{y=<1xt{d*mJ(ATQs@X*s>a(~iSyDa0- zZ^+ZQSM^Job+dlj#|tTihkJ!Lq0Up*558x~x!`V9_ z_+QIvzr7ttWpI|Q!1EWJ2jMc$7nV1J@qFib5H9OC)@H<*Tw~7@g!c4z0n1sFV^f>1 z!F-U5J)Tc2uWzlgKCB7a<4j3R*}u(({aK3Dw%BY$d82K=B2?zQkc+*IcBRQz5c|K` z_9t9sEb_KTajg{@QDIgepVFGv_+daS?t< b>V4n^+A^=dcBc5ueeZ7JJKDszJgoaKtE;~+ literal 0 HcmV?d00001 diff --git a/Assets/Scenes/Playground 1/NavMesh.asset.meta b/Assets/Scenes/Playground 1/NavMesh.asset.meta new file mode 100644 index 0000000..d7d1b67 --- /dev/null +++ b/Assets/Scenes/Playground 1/NavMesh.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b015bab8bed002c438c2a5abb0deec18 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 23800000 + userData: + assetBundleName: + assetBundleVariant: