diff --git a/MrBigsock/Assets/Code/Character.cs b/MrBigsock/Assets/Code/Character.cs index 4fcb42cabba858172e22000dfd039ea6fe600404..50524d5e2a4be94e819abcb169ec63f0ff58857d 100644 --- a/MrBigsock/Assets/Code/Character.cs +++ b/MrBigsock/Assets/Code/Character.cs @@ -152,7 +152,7 @@ namespace BigSock { } /* - Adds damage to the player if they don't have IFrames. + Adds damage to the character if they don't have IFrames. */ public virtual bool TakeDamage(AttackStats attack) { // Check if player has IFrames @@ -163,25 +163,39 @@ namespace BigSock { NextTimeCanTakeDamage = DateTime.Now + IFrameDuration; // Trigger the event for taking damage. - OnTakeDamage?.Invoke(this, attack?.Actor, attack); + OnTakeDamage?.Invoke(this, attack.Actor, attack); + + // Inform the attacker they hit us. + if(attack.Actor != null) attack.Actor.TargetHit(this, attack); + // Add damage HP -= attack.Damage; AfterDamage(attack); - TryKill(); + TryKill(attack); return true; } /* - Try to kill the player. + Try to kill the character. */ - public bool TryKill() { + public bool TryKill(AttackStats attack) { if(Alive && HP <= 0) { + + + // Trigger the event for us dying. + OnDeath?.Invoke(this, attack.Actor, attack); + + //== PUT CODE HERE TO HANDLE IF WE DODGED DEATH (In case we had an item to revieve or cheat death) + Alive = false; + // Inform the attacker killed us. + if(attack.Actor != null) attack.Actor.TargetKilled(this, attack); + AfterDeath(); return true; @@ -190,11 +204,31 @@ namespace BigSock { } + /* + Method for healing the character. + */ + public bool TryHeal(float amount) { + // Can't heal if full. + if(HP >= MaxHP) { + print($"[Character.TryHeal()] Already Full! ({HP:N1} >= {MaxHP:N1})"); + return false; + } + + print($"[Character.TryHeal()] {HP:N1} + {amount:N1} = {HP + amount:N1}"); + OnHeal?.Invoke(this, amount); + + // Heal the character. + var res = HP + amount; + if(res > MaxHP) res = MaxHP; + HP = res; + return true; + } + /* Method for what to do when the character takes damage. */ protected virtual void AfterDamage(IAttackStats attack) { - print($"[Character.AfterDamage()] {HP} - {attack.Damage}"); + print($"[Character.AfterDamage()] {HP + attack.Damage:N1} - {attack.Damage:N1} = {HP:N1}"); KnockBack(attack); } @@ -288,6 +322,12 @@ namespace BigSock { OnHit?.Invoke(this, target, attack); } + /* + Trigers the OnKill event. + */ + public void TargetKilled(Character target, AttackStats attack) { + OnKill?.Invoke(this, target, attack); + } /* Triggers when character uses an attack. @@ -321,7 +361,7 @@ namespace BigSock { Params: actor, amount. (Add heal source later on) */ - public event Action<Character, int> OnHeal; + public event Action<Character, float> OnHeal; /* Triggers when character has taken fatal damage. diff --git a/MrBigsock/Assets/Code/Core/Abilities/Base/BaseAbility.cs b/MrBigsock/Assets/Code/Core/Abilities/Base/BaseAbility.cs index aeb2f81303eb2b14696519bb3c445a6e9baf42aa..dfc797c2f90ab87607ac90e2f58f1a99e70f2b47 100644 --- a/MrBigsock/Assets/Code/Core/Abilities/Base/BaseAbility.cs +++ b/MrBigsock/Assets/Code/Core/Abilities/Base/BaseAbility.cs @@ -50,7 +50,7 @@ namespace BigSock { Handles cooldown and ability cost here. Returns true if the ability was successfully used. */ - public bool Use(Character actor, Vector2 target) { + public bool Use(Character actor, Vector3? target = null) { // Check that the ability is cooled down. if(Ready) { //> Handle checking costs here. @@ -77,7 +77,7 @@ namespace BigSock { - Even if nothing was hit, used to indicate that cooldowns should be updated. This should be overridden in sub-classes for the actual abilities. */ - protected abstract bool Activate(Character actor, Vector2 target); + protected abstract bool Activate(Character actor, Vector3? target); } diff --git a/MrBigsock/Assets/Code/Core/Abilities/Base/IAbility.cs b/MrBigsock/Assets/Code/Core/Abilities/Base/IAbility.cs index 80fa70963e840b5f6aef56553106009215b67628..07034791d6bbc841104db946dc9025a1413c3647 100644 --- a/MrBigsock/Assets/Code/Core/Abilities/Base/IAbility.cs +++ b/MrBigsock/Assets/Code/Core/Abilities/Base/IAbility.cs @@ -57,6 +57,6 @@ namespace BigSock { /* Try to use the ability. */ - bool Use(Character actor, Vector2 target); + bool Use(Character actor, Vector3? target); } } \ No newline at end of file diff --git a/MrBigsock/Assets/Code/Core/Abilities/BasicProjectile1.cs b/MrBigsock/Assets/Code/Core/Abilities/BasicProjectile1.cs index b92dea6dbbca44f2f838dd7ec45ad064ef545bc1..b7e1e8189da0a411a88414cca0d135d37c661840 100644 --- a/MrBigsock/Assets/Code/Core/Abilities/BasicProjectile1.cs +++ b/MrBigsock/Assets/Code/Core/Abilities/BasicProjectile1.cs @@ -1,9 +1,11 @@ using System.Collections; using System; using System.Collections.Generic; + using UnityEngine; using UnityEngine.InputSystem; +using BigSock.Service; namespace BigSock { @@ -12,7 +14,8 @@ namespace BigSock { */ public class BasicProjectile1 : BaseAttack { //protected static readonly GameObject PROJECTILE_BASE = new AttackMovement(); - + public const string PROJECTILE_NAME = "attack"; + /* The attack stats of the ability. */ @@ -34,7 +37,10 @@ namespace BigSock { - Even if nothing was hit, used to indicate that cooldowns should be updated. This should be overridden in sub-classes for the actual abilities. */ - protected override bool Activate(Character actor, Vector2 target) { + protected override bool Activate(Character actor, Vector3? target) { + var bullet = PrefabService.SINGLETON.Instance(PROJECTILE_NAME, actor.transform.position); + bullet.GetComponent<AttackMovement>().Actor = actor; + //MonoBehaviour.Instantiate(PROJECTILE_BASE, (Vector3) actor.transform.position, PROJECTILE_BASE.transform.rotation); return true; } diff --git a/MrBigsock/Assets/Code/Item/Base/Conditional/OnHealItemBase.cs b/MrBigsock/Assets/Code/Item/Base/Conditional/OnHealItemBase.cs index 4a27777331f36ee29e41c331ce777d8627f8b943..8322d480a07cac05942a5223603346930b6f30d2 100644 --- a/MrBigsock/Assets/Code/Item/Base/Conditional/OnHealItemBase.cs +++ b/MrBigsock/Assets/Code/Item/Base/Conditional/OnHealItemBase.cs @@ -19,7 +19,7 @@ namespace BigSock.Item { /* The handler to activate when the condition is triggered. */ - public abstract void Handler(Character source, int amount); + public abstract void Handler(Character source, float amount); } } \ No newline at end of file diff --git a/MrBigsock/Assets/Code/Item/Items/ItemFourEyes.cs b/MrBigsock/Assets/Code/Item/Items/ItemFourEyes.cs index f3401629412b59b8f921a1d530b9aa0c850d8226..d70670cf520e0fed4e54e6c08ba8cac82a5bbaeb 100644 --- a/MrBigsock/Assets/Code/Item/Items/ItemFourEyes.cs +++ b/MrBigsock/Assets/Code/Item/Items/ItemFourEyes.cs @@ -34,11 +34,11 @@ namespace BigSock.Item { // Check if it triggers. var roll = RND.NextDouble(); - if(roll >= CHANCE) { + if(roll <= CHANCE) { + MonoBehaviour.print($"[ItemFourEyes.Handler()] Hit. ({roll:P1} <= {CHANCE:P1})"); attack.Damage *= 2; - MonoBehaviour.print($"[ItemFourEyes.Handler()] Hit. ({roll:P1} >= {CHANCE:P1})"); } else { - MonoBehaviour.print($"[ItemFourEyes.Handler()] Miss. ({roll:P1} < {CHANCE:P1})"); + MonoBehaviour.print($"[ItemFourEyes.Handler()] Miss. ({roll:P1} > {CHANCE:P1})"); } } diff --git a/MrBigsock/Assets/Code/Item/Items/ItemPlasticStraw.cs b/MrBigsock/Assets/Code/Item/Items/ItemPlasticStraw.cs new file mode 100644 index 0000000000000000000000000000000000000000..5455172387f374488cedb6d2b130a73aa1ac0837 --- /dev/null +++ b/MrBigsock/Assets/Code/Item/Items/ItemPlasticStraw.cs @@ -0,0 +1,32 @@ +using System.Collections; +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.InputSystem; + + +namespace BigSock.Item { + + /* + An item that heals the user on kill. + */ + public class ItemPlasticStraw : OnKillItemBase { + public override ulong Id => 202; + public override string Name => "Plastic Straw"; + public override string Description => "Heal the user on kill."; + + public static readonly double CHANCE = 1.0; + + public override void Handler(Character source, Character target, AttackStats attack) { + // Check if it triggers. + var roll = RND.NextDouble(); + if(roll <= CHANCE) { + MonoBehaviour.print($"[ItemPlasticStraw.Handler()] Hit. ({roll:P1} <= {CHANCE:P1})"); + source.TryHeal(1.5f); + } else { + MonoBehaviour.print($"[ItemPlasticStraw.Handler()] Miss. ({roll:P1} > {CHANCE:P1})"); + } + } + + } +} \ No newline at end of file diff --git a/MrBigsock/Assets/Code/Item/Items/ItemPlasticStraw.cs.meta b/MrBigsock/Assets/Code/Item/Items/ItemPlasticStraw.cs.meta new file mode 100644 index 0000000000000000000000000000000000000000..55418100dec3194f3fde293cafdd23893ba3a634 --- /dev/null +++ b/MrBigsock/Assets/Code/Item/Items/ItemPlasticStraw.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c24f1f2ed9cc63f4b9de7e0997060e4e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MrBigsock/Assets/Code/PlayerController.cs b/MrBigsock/Assets/Code/PlayerController.cs index 5f1a6a4ace8e6c3b22c8e668b6a0e2c10464cf45..d07507999d825f65ae26b8ebbcc9a6858d8fdbf2 100644 --- a/MrBigsock/Assets/Code/PlayerController.cs +++ b/MrBigsock/Assets/Code/PlayerController.cs @@ -32,7 +32,7 @@ namespace BigSock { - + protected IAttack _testAttack = new BasicProjectile1(); public DateTime NextTimeCanAttack { get; private set; } = DateTime.Now; @@ -51,6 +51,8 @@ namespace BigSock { //!! DEBUG: Add item to player at start to test if it works. TryPickUpItem(ItemService.SINGLETON.Get(201)); TryPickUpItem(ItemService.SINGLETON.Get(201)); + TryPickUpItem(ItemService.SINGLETON.Get(202)); + var tmp = PrefabService.SINGLETON; } @@ -97,10 +99,12 @@ namespace BigSock { if (Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButton(0)) { // Manage attack cooldown. if(NextTimeCanAttack <= DateTime.Now) { - NextTimeCanAttack = DateTime.Now.AddSeconds(AttackCooldown); + //NextTimeCanAttack = DateTime.Now.AddSeconds(AttackCooldown); + + //var bullet = Instantiate(attack, new Vector3(transform.position.x, transform.position.y, transform.position.z), attack.transform.rotation); + //bullet.GetComponent<AttackMovement>().Actor = this; - var bullet = Instantiate(attack, new Vector3(transform.position.x, transform.position.y, transform.position.z), attack.transform.rotation); - bullet.GetComponent<AttackMovement>().Actor = this; + _testAttack.Use(this, Camera.main.ScreenToWorldPoint(Input.mousePosition)); } } diff --git a/MrBigsock/Assets/Code/Services/ItemService.cs b/MrBigsock/Assets/Code/Services/ItemService.cs index c739901a0b11b6f58a92ea998f302303a2fdb83c..364673ebf31414f9b4c276b409d35b2a9ea23452 100644 --- a/MrBigsock/Assets/Code/Services/ItemService.cs +++ b/MrBigsock/Assets/Code/Services/ItemService.cs @@ -51,7 +51,6 @@ namespace BigSock.Service { /* Load the items into the dictionary. - (Hard-coded for now, use reflection later) Reflection code: https://stackoverflow.com/a/6944605 */ private void _loadItems() { diff --git a/MrBigsock/Assets/Code/Services/PrefabService.cs b/MrBigsock/Assets/Code/Services/PrefabService.cs new file mode 100644 index 0000000000000000000000000000000000000000..2dab1bbdefca4f823dd3f488fdd05c60b28a9521 --- /dev/null +++ b/MrBigsock/Assets/Code/Services/PrefabService.cs @@ -0,0 +1,86 @@ +using System.Collections; +using System; +using System.Linq; +using System.Collections.Generic; +using System.Reflection; + +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEditor; + +using BigSock.Item; + + +namespace BigSock.Service { + + /* + Service for handling prefabs. + */ + public partial class PrefabService { + /* + The instance to use. + */ + public static readonly PrefabService SINGLETON = new PrefabService(); + + /* + Get a prefab of a name. + */ + public GameObject Get(string name) { + if(_prefabs.TryGetValue(_sanitize(name), out var res)) return res; + return null; + } + + + /* + Create an instance of a prefab. + */ + public GameObject Instance(GameObject obj, Vector3? pos = null) { + var res = MonoBehaviour.Instantiate(obj, pos ?? (Vector3) obj.transform.position, obj.transform.rotation); + return res; + } + public GameObject Instance(string name, Vector3? pos = null) + => Instance(_prefabs[_sanitize(name)], pos); + + /* + Destroy an instance. + */ + public void Destroy(GameObject obj) + => MonoBehaviour.Destroy(obj); + + } + + public partial class PrefabService { + private Dictionary<string, GameObject> _prefabs = new Dictionary<string, GameObject>(); + + private System.Random _rnd = new System.Random(); + + private PrefabService() { + _loadItems(); + } + + /* + Load the items into the dictionary. + Based on: https://stackoverflow.com/a/67670629 + */ + private void _loadItems() { + string[] guids = AssetDatabase.FindAssets( "t:Prefab", new string[] {"Assets/Prefabs"} ); + + var dict = new Dictionary<string, GameObject>(); + + foreach(var guid in guids) { + var path = AssetDatabase.GUIDToAssetPath( guid ); + var name = _sanitize(path.Replace(".prefab", "").Replace("Assets/Prefabs/", "")); + GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>( path ); + + Debug.Log($"[PrefabService._loadItems()] {name}"); + dict[name] = go; + } + + _prefabs = dict; + } + + private string _sanitize(string name) + => name.Replace(" ", "").Replace("_", "").ToLower(); + + } +} \ No newline at end of file diff --git a/MrBigsock/Assets/Code/Services/PrefabService.cs.meta b/MrBigsock/Assets/Code/Services/PrefabService.cs.meta new file mode 100644 index 0000000000000000000000000000000000000000..d398e58abc610651e186b702a0e089faefd61bd8 --- /dev/null +++ b/MrBigsock/Assets/Code/Services/PrefabService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b818d945e9735e643ab67c7190d3ac9f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MrBigsock/Assets/Code/attack/AttackMovement.cs b/MrBigsock/Assets/Code/attack/AttackMovement.cs index 5ed4cc03c3546ebd8334d702e8d2cbb57d10f985..37b53fa9705d5bfb24c47e4824e351bdf21de880 100644 --- a/MrBigsock/Assets/Code/attack/AttackMovement.cs +++ b/MrBigsock/Assets/Code/attack/AttackMovement.cs @@ -71,7 +71,7 @@ namespace BigSock { if(Actor != null) { attack.Damage *= Actor.Damage; attack.Knockback *= Actor.KnockbackForce; - Actor.TargetHit(target, attack); + //Actor.TargetHit(target, attack); } if(target.TakeDamage(attack)) { diff --git a/MrBigsock/Assets/Prefabs/Test.meta b/MrBigsock/Assets/Prefabs/Test.meta new file mode 100644 index 0000000000000000000000000000000000000000..8110b43873492ac7d9053c2d8fc0a18c35392888 --- /dev/null +++ b/MrBigsock/Assets/Prefabs/Test.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ab1236fcd80cdcd4087feefb329f93be +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MrBigsock/Assets/Prefabs/Test/attack 1.prefab b/MrBigsock/Assets/Prefabs/Test/attack 1.prefab new file mode 100644 index 0000000000000000000000000000000000000000..76613d515234fdb4e24ae1ca5229f74135429a9d --- /dev/null +++ b/MrBigsock/Assets/Prefabs/Test/attack 1.prefab @@ -0,0 +1,164 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &7173793660907891926 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7173793660907891920} + - component: {fileID: 7173793660907891921} + - component: {fileID: 7173793660907891922} + - component: {fileID: 7173793660907891949} + - component: {fileID: 7173793660907891948} + - component: {fileID: 5355219341519538053} + m_Layer: 10 + m_Name: attack 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7173793660907891920 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7173793660907891926} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.0584211, y: -1.6348, z: 0} + m_LocalScale: {x: 0.27652767, y: 0.27652767, z: 0.27652767} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &7173793660907891921 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7173793660907891926} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 2 + m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!61 &7173793660907891922 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7173793660907891926} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0.5, y: 0.5} + oldSize: {x: 1, y: 1} + newSize: {x: 1, y: 1} + adaptiveTilingThreshold: 0.5 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + serializedVersion: 2 + m_Size: {x: 1, y: 1} + m_EdgeRadius: 0 +--- !u!50 &7173793660907891949 +Rigidbody2D: + serializedVersion: 4 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7173793660907891926} + m_BodyType: 0 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 1 + m_LinearDrag: 0 + m_AngularDrag: 0.05 + m_GravityScale: 0 + m_Material: {fileID: 0} + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 4 +--- !u!114 &7173793660907891948 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7173793660907891926} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 08cde138491863f44997ffed19e030dd, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &5355219341519538053 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7173793660907891926} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3ae233c400f83844da0350aabdf5097d, type: 3} + m_Name: + m_EditorClassIdentifier: + speed: 10 + baseDamage: 1 + knockbackForce: 2 diff --git a/MrBigsock/Assets/Prefabs/Test/attack 1.prefab.meta b/MrBigsock/Assets/Prefabs/Test/attack 1.prefab.meta new file mode 100644 index 0000000000000000000000000000000000000000..4894bab2f51392186c537a59675dcbf622134704 --- /dev/null +++ b/MrBigsock/Assets/Prefabs/Test/attack 1.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 90d3ad8365877544cad09c96114a968f +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: