diff --git a/Basic/Invaders/Assets/Prefabs/Invaders Game Manager.prefab b/Basic/Invaders/Assets/Prefabs/Invaders Game Manager.prefab index d68012808..dbfb0dfb4 100644 --- a/Basic/Invaders/Assets/Prefabs/Invaders Game Manager.prefab +++ b/Basic/Invaders/Assets/Prefabs/Invaders Game Manager.prefab @@ -44,10 +44,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d643b609c6a71c54984c1ad454faa28b, type: 3} m_Name: m_EditorClassIdentifier: - alien1Prefab: {fileID: 100000, guid: 43ae6ad1bdadd0747811bb7a00740c2c, type: 3} - alien2Prefab: {fileID: 100000, guid: 38a8441efb2d6d245adbf08f08705374, type: 3} - alien3Prefab: {fileID: 100000, guid: aa50d36274d0dfc4faff2c69820b3711, type: 3} - saucerPrefab: {fileID: 100000, guid: e811e4fb062e31444aaf36dbec5de77c, type: 3} + enemy1Prefab: {fileID: 100000, guid: 43ae6ad1bdadd0747811bb7a00740c2c, type: 3} + enemy2Prefab: {fileID: 100000, guid: 38a8441efb2d6d245adbf08f08705374, type: 3} + enemy3Prefab: {fileID: 100000, guid: aa50d36274d0dfc4faff2c69820b3711, type: 3} + superEnemyPrefab: {fileID: 100000, guid: e811e4fb062e31444aaf36dbec5de77c, type: 3} shieldPrefab: {fileID: 100000, guid: b990a6e6dcf54b646a7397028fed6045, type: 3} gameTimerText: {fileID: 0} scoreText: {fileID: 0} @@ -57,7 +57,7 @@ MonoBehaviour: m_DelayedStartTime: 5 m_TickPeriodic: m_InternalValue: 0.2 - m_AlienDirection: + m_EnemyMovingDirection: m_InternalValue: 0.3 m_RandomThresholdForSaucerCreation: 0.92 --- !u!114 &4266113290039088509 diff --git a/Basic/Invaders/Assets/Prefabs/bullet.prefab b/Basic/Invaders/Assets/Prefabs/bullet.prefab index 2d0b2b1af..ad3df2d00 100644 --- a/Basic/Invaders/Assets/Prefabs/bullet.prefab +++ b/Basic/Invaders/Assets/Prefabs/bullet.prefab @@ -100,7 +100,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: owner: {fileID: 0} - m_TravelSpeed: 6 + m_TravelSpeed: 7.25 --- !u!61 &6100000 BoxCollider2D: m_ObjectHideFlags: 0 diff --git a/Basic/Invaders/Assets/Prefabs/alien1.prefab b/Basic/Invaders/Assets/Prefabs/enemy1.prefab similarity index 97% rename from Basic/Invaders/Assets/Prefabs/alien1.prefab rename to Basic/Invaders/Assets/Prefabs/enemy1.prefab index 8b19a68b8..b0acf623e 100644 --- a/Basic/Invaders/Assets/Prefabs/alien1.prefab +++ b/Basic/Invaders/Assets/Prefabs/enemy1.prefab @@ -16,7 +16,7 @@ GameObject: - component: {fileID: 4223722966607089368} - component: {fileID: 2037077820506562951} m_Layer: 0 - m_Name: alien1 + m_Name: enemy1 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -76,7 +76,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 21300000, guid: 46fc833f46553be4bae0ba363af8e5b7, type: 3} + m_Sprite: {fileID: 21300000, guid: 4ab7e7189ab754124aa83e1fa63dc0c2, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -101,6 +101,7 @@ MonoBehaviour: m_EditorClassIdentifier: score: 10 bulletPrefab: {fileID: 100000, guid: ac6ffb0923d0f7448852a32312a0263c, type: 3} + GraceShootingPeriod: 1 --- !u!61 &6100000 BoxCollider2D: m_ObjectHideFlags: 0 diff --git a/Basic/Invaders/Assets/Prefabs/alien1.prefab.meta b/Basic/Invaders/Assets/Prefabs/enemy1.prefab.meta similarity index 100% rename from Basic/Invaders/Assets/Prefabs/alien1.prefab.meta rename to Basic/Invaders/Assets/Prefabs/enemy1.prefab.meta diff --git a/Basic/Invaders/Assets/Prefabs/alien2.prefab b/Basic/Invaders/Assets/Prefabs/enemy2.prefab similarity index 97% rename from Basic/Invaders/Assets/Prefabs/alien2.prefab rename to Basic/Invaders/Assets/Prefabs/enemy2.prefab index e5ff0221c..8700ed562 100644 --- a/Basic/Invaders/Assets/Prefabs/alien2.prefab +++ b/Basic/Invaders/Assets/Prefabs/enemy2.prefab @@ -16,7 +16,7 @@ GameObject: - component: {fileID: 8401436849663568366} - component: {fileID: 1361474663871475650} m_Layer: 0 - m_Name: alien2 + m_Name: enemy2 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -76,7 +76,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 21300000, guid: bb17efd32f1b62b47b9d3876d96c0b2c, type: 3} + m_Sprite: {fileID: 21300000, guid: 6416b5a3e55ca443985a9882ff71d879, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -101,6 +101,7 @@ MonoBehaviour: m_EditorClassIdentifier: score: 20 bulletPrefab: {fileID: 100000, guid: ac6ffb0923d0f7448852a32312a0263c, type: 3} + GraceShootingPeriod: 1 --- !u!61 &6100000 BoxCollider2D: m_ObjectHideFlags: 0 diff --git a/Basic/Invaders/Assets/Prefabs/alien2.prefab.meta b/Basic/Invaders/Assets/Prefabs/enemy2.prefab.meta similarity index 100% rename from Basic/Invaders/Assets/Prefabs/alien2.prefab.meta rename to Basic/Invaders/Assets/Prefabs/enemy2.prefab.meta diff --git a/Basic/Invaders/Assets/Prefabs/alien3.prefab b/Basic/Invaders/Assets/Prefabs/enemy3.prefab similarity index 97% rename from Basic/Invaders/Assets/Prefabs/alien3.prefab rename to Basic/Invaders/Assets/Prefabs/enemy3.prefab index 352bab233..067c48c10 100644 --- a/Basic/Invaders/Assets/Prefabs/alien3.prefab +++ b/Basic/Invaders/Assets/Prefabs/enemy3.prefab @@ -16,7 +16,7 @@ GameObject: - component: {fileID: 8349640660830732066} - component: {fileID: 7651551376209856180} m_Layer: 0 - m_Name: alien3 + m_Name: enemy3 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -76,7 +76,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 21300000, guid: 33ed2981c8de0d44b9881e822df7a931, type: 3} + m_Sprite: {fileID: 21300000, guid: b8a22d7f951c14967b823fdb049384a8, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -101,6 +101,7 @@ MonoBehaviour: m_EditorClassIdentifier: score: 30 bulletPrefab: {fileID: 100000, guid: ac6ffb0923d0f7448852a32312a0263c, type: 3} + GraceShootingPeriod: 1 --- !u!61 &6100000 BoxCollider2D: m_ObjectHideFlags: 0 diff --git a/Basic/Invaders/Assets/Prefabs/alien3.prefab.meta b/Basic/Invaders/Assets/Prefabs/enemy3.prefab.meta similarity index 100% rename from Basic/Invaders/Assets/Prefabs/alien3.prefab.meta rename to Basic/Invaders/Assets/Prefabs/enemy3.prefab.meta diff --git a/Basic/Invaders/Assets/Prefabs/alienbullet.prefab b/Basic/Invaders/Assets/Prefabs/enemyBullet.prefab similarity index 99% rename from Basic/Invaders/Assets/Prefabs/alienbullet.prefab rename to Basic/Invaders/Assets/Prefabs/enemyBullet.prefab index 183e83d92..c1036e62e 100644 --- a/Basic/Invaders/Assets/Prefabs/alienbullet.prefab +++ b/Basic/Invaders/Assets/Prefabs/enemyBullet.prefab @@ -16,7 +16,7 @@ GameObject: - component: {fileID: 2336033219118315817} - component: {fileID: 5836440591138289839} m_Layer: 0 - m_Name: alienbullet + m_Name: enemyBullet m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Basic/Invaders/Assets/Prefabs/alienbullet.prefab.meta b/Basic/Invaders/Assets/Prefabs/enemyBullet.prefab.meta similarity index 100% rename from Basic/Invaders/Assets/Prefabs/alienbullet.prefab.meta rename to Basic/Invaders/Assets/Prefabs/enemyBullet.prefab.meta diff --git a/Basic/Invaders/Assets/Prefabs/player 1.prefab b/Basic/Invaders/Assets/Prefabs/player 1.prefab index f05cf55da..0683599c3 100644 --- a/Basic/Invaders/Assets/Prefabs/player 1.prefab +++ b/Basic/Invaders/Assets/Prefabs/player 1.prefab @@ -75,7 +75,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 21300000, guid: 6e31b7ae591614d4396749e68a6ba020, type: 3} + m_Sprite: {fileID: 21300000, guid: ccc6b3ea84f7e4550b618abc8d06dd5d, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -119,7 +119,7 @@ BoxCollider2D: m_SpriteTilingProperty: border: {x: 0, y: 0, z: 0, w: 0} pivot: {x: 0.5, y: 0.5} - oldSize: {x: 1.28, y: 0.84} + oldSize: {x: 1.28, y: 1.28} newSize: {x: 1, y: 1} adaptiveTilingThreshold: 0.5 drawMode: 0 diff --git a/Basic/Invaders/Assets/Prefabs/player.prefab b/Basic/Invaders/Assets/Prefabs/player.prefab index 6a1ac9ad0..ea6b22293 100644 --- a/Basic/Invaders/Assets/Prefabs/player.prefab +++ b/Basic/Invaders/Assets/Prefabs/player.prefab @@ -76,7 +76,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 21300000, guid: 6e31b7ae591614d4396749e68a6ba020, type: 3} + m_Sprite: {fileID: 21300000, guid: ccc6b3ea84f7e4550b618abc8d06dd5d, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -120,7 +120,7 @@ BoxCollider2D: m_SpriteTilingProperty: border: {x: 0, y: 0, z: 0, w: 0} pivot: {x: 0.5, y: 0.5} - oldSize: {x: 1.28, y: 0.84} + oldSize: {x: 1.28, y: 1.28} newSize: {x: 1, y: 1} adaptiveTilingThreshold: 0.5 drawMode: 0 diff --git a/Basic/Invaders/Assets/Prefabs/saucerr.prefab b/Basic/Invaders/Assets/Prefabs/superEnemy.prefab similarity index 97% rename from Basic/Invaders/Assets/Prefabs/saucerr.prefab rename to Basic/Invaders/Assets/Prefabs/superEnemy.prefab index ef01d4191..aa483eed1 100644 --- a/Basic/Invaders/Assets/Prefabs/saucerr.prefab +++ b/Basic/Invaders/Assets/Prefabs/superEnemy.prefab @@ -17,7 +17,7 @@ GameObject: - component: {fileID: 8984612552865464625} - component: {fileID: 3955316467729786863} m_Layer: 0 - m_Name: saucerr + m_Name: superEnemy m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -77,7 +77,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 21300000, guid: 9b0a23d4f4a4b5f4dad77b73d477aec2, type: 3} + m_Sprite: {fileID: 21300000, guid: 4814484f2408640ddb51647c66bdbc8e, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -123,6 +123,7 @@ MonoBehaviour: m_EditorClassIdentifier: score: 75 bulletPrefab: {fileID: 100000, guid: ac6ffb0923d0f7448852a32312a0263c, type: 3} + GraceShootingPeriod: 1 --- !u!114 &11400004 MonoBehaviour: m_ObjectHideFlags: 0 @@ -153,7 +154,7 @@ BoxCollider2D: m_SpriteTilingProperty: border: {x: 0, y: 0, z: 0, w: 0} pivot: {x: 0.5, y: 0.5} - oldSize: {x: 2.05, y: 1.02} + oldSize: {x: 1.28, y: 1.28} newSize: {x: 1, y: 1} adaptiveTilingThreshold: 0.5 drawMode: 0 diff --git a/Basic/Invaders/Assets/Prefabs/saucerr.prefab.meta b/Basic/Invaders/Assets/Prefabs/superEnemy.prefab.meta similarity index 100% rename from Basic/Invaders/Assets/Prefabs/saucerr.prefab.meta rename to Basic/Invaders/Assets/Prefabs/superEnemy.prefab.meta diff --git a/Basic/Invaders/Assets/Scenes/InGame.unity b/Basic/Invaders/Assets/Scenes/InGame.unity index 013f307c8..35c574806 100644 --- a/Basic/Invaders/Assets/Scenes/InGame.unity +++ b/Basic/Invaders/Assets/Scenes/InGame.unity @@ -253,7 +253,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -146.79999} + m_AnchoredPosition: {x: 0, y: -75.218} m_SizeDelta: {x: 90, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &16114619 @@ -557,7 +557,7 @@ MonoBehaviour: m_fontColor32: serializedVersion: 2 rgba: 4280690380 - m_fontColor: {r: 0.8018868, g: 0.14751692, b: 0.14751692, a: 1} + m_fontColor: {r: 0.990566, g: 0, b: 0.13591357, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -809,7 +809,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -361.4607, y: -142} + m_AnchoredPosition: {x: -200, y: -52.172} m_SizeDelta: {x: 135.624, y: 46.0926} m_Pivot: {x: 1, y: 1} --- !u!114 &740254072 @@ -1332,7 +1332,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -168.6} + m_AnchoredPosition: {x: 0, y: -109} m_SizeDelta: {x: 72.0173, y: 50} m_Pivot: {x: 0.5, y: 1} --- !u!114 &1087760897 @@ -1472,7 +1472,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 400, y: -123.363464} + m_AnchoredPosition: {x: 200, y: -56} m_SizeDelta: {x: 186.1548, y: 38.4365} m_Pivot: {x: 0, y: 1} --- !u!114 &1118830665 @@ -1846,11 +1846,6 @@ PrefabInstance: propertyPath: saucerSpawnPoint value: objectReference: {fileID: 1031245994} - - target: {fileID: 4266113290039088507, guid: 67eb58ec33df0475ca152786107f9037, - type: 3} - propertyPath: m_DelayedStartTime - value: 10 - objectReference: {fileID: 0} - target: {fileID: 4266113290039088508, guid: 67eb58ec33df0475ca152786107f9037, type: 3} propertyPath: m_Name diff --git a/Basic/Invaders/Assets/Scenes/InvadersLobby.unity b/Basic/Invaders/Assets/Scenes/InvadersLobby.unity index c99525c3e..a8af61dd8 100644 --- a/Basic/Invaders/Assets/Scenes/InvadersLobby.unity +++ b/Basic/Invaders/Assets/Scenes/InvadersLobby.unity @@ -261,7 +261,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: bb17efd32f1b62b47b9d3876d96c0b2c, type: 3} + m_Sprite: {fileID: 21300000, guid: 6416b5a3e55ca443985a9882ff71d879, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -450,7 +450,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 46fc833f46553be4bae0ba363af8e5b7, type: 3} + m_Sprite: {fileID: 21300000, guid: 4ab7e7189ab754124aa83e1fa63dc0c2, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -532,6 +532,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_InGameSceneName: InGame + m_MinimumPlayerCount: 2 LobbyText: {fileID: 888252281} --- !u!114 &698002441 MonoBehaviour: @@ -1249,7 +1250,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 33ed2981c8de0d44b9881e822df7a931, type: 3} + m_Sprite: {fileID: 21300000, guid: b8a22d7f951c14967b823fdb049384a8, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1302,7 +1303,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -208.49, y: -177.95} - m_SizeDelta: {x: 80, y: 40} + m_SizeDelta: {x: 50, y: 70} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1979523618 MonoBehaviour: @@ -1324,7 +1325,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 9b0a23d4f4a4b5f4dad77b73d477aec2, type: 3} + m_Sprite: {fileID: 21300000, guid: 4814484f2408640ddb51647c66bdbc8e, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 diff --git a/Basic/Invaders/Assets/Scenes/StartMenu.unity b/Basic/Invaders/Assets/Scenes/StartMenu.unity index a3beb629c..f3e3a9147 100644 --- a/Basic/Invaders/Assets/Scenes/StartMenu.unity +++ b/Basic/Invaders/Assets/Scenes/StartMenu.unity @@ -485,7 +485,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: bb17efd32f1b62b47b9d3876d96c0b2c, type: 3} + m_Sprite: {fileID: 21300000, guid: 6416b5a3e55ca443985a9882ff71d879, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -674,7 +674,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 46fc833f46553be4bae0ba363af8e5b7, type: 3} + m_Sprite: {fileID: 21300000, guid: 4ab7e7189ab754124aa83e1fa63dc0c2, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1510,7 +1510,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 33ed2981c8de0d44b9881e822df7a931, type: 3} + m_Sprite: {fileID: 21300000, guid: b8a22d7f951c14967b823fdb049384a8, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1563,7 +1563,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -208.49, y: -177.95} - m_SizeDelta: {x: 80, y: 40} + m_SizeDelta: {x: 60, y: 70} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1979523618 MonoBehaviour: @@ -1585,7 +1585,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 9b0a23d4f4a4b5f4dad77b73d477aec2, type: 3} + m_Sprite: {fileID: 21300000, guid: 4814484f2408640ddb51647c66bdbc8e, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 diff --git a/Basic/Invaders/Assets/Scripts/AlienInvader.cs b/Basic/Invaders/Assets/Scripts/EnemyAgent.cs similarity index 69% rename from Basic/Invaders/Assets/Scripts/AlienInvader.cs rename to Basic/Invaders/Assets/Scripts/EnemyAgent.cs index 6bee9b43b..29eadf4eb 100644 --- a/Basic/Invaders/Assets/Scripts/AlienInvader.cs +++ b/Basic/Invaders/Assets/Scripts/EnemyAgent.cs @@ -4,22 +4,63 @@ using UnityEngine.Assertions; using Random = UnityEngine.Random; -public class AlienInvader : NetworkBehaviour +public class EnemyAgent : NetworkBehaviour { private const float k_ShootingRandomThreshold = 0.996f; - private const float k_ShootTimer = 0.75f; - [Header("Alien Settings")] + private const float k_ShootTimer = 1.25f; + [Header("Enemy Settings")] public int score = 50; public GameObject bulletPrefab; + public float GraceShootingPeriod = 1.0f; // A period of time in which the enemy will not shoot at the start public bool canShoot { get; set; } public float column { get; private set; } public float row { get; private set; } private float m_ShootTimer = 0.0f; + private float m_FirstShootTimeAfterSpawn = 0.0f; + public void Awake() + { + canShoot = false; + m_FirstShootTimeAfterSpawn = Single.PositiveInfinity; + } + + public override void NetworkStart() + { + base.NetworkStart(); + + if (IsServer) + { + canShoot = false; + if (score == 100) + return; + + m_FirstShootTimeAfterSpawn = + Time.time + Random.Range(GraceShootingPeriod - 0.1f, GraceShootingPeriod + 0.75f); + + Assert.IsNotNull(InvadersGame.Singleton); + InvadersGame.Singleton.RegisterSpawnableObject(InvadersObjectType.Enemy, gameObject); + InvadersGame.Singleton.isGameOver.OnValueChanged += OnGameOver; + } + } + + protected void OnDestroy() + { + if (!InvadersGame.Singleton) return; + + if (IsServer) InvadersGame.Singleton.UnregisterSpawnableObject(InvadersObjectType.Enemy, gameObject); + InvadersGame.Singleton.isGameOver.OnValueChanged -= OnGameOver; + } + private void Update() { + if (Time.time <= m_FirstShootTimeAfterSpawn) + { + // Wait for the grace shooting period to pass + return; + } + bool bCanShootThisFrame = false; if (IsServer && canShoot) if (Random.Range(0, 1.0f) > k_ShootingRandomThreshold) @@ -30,7 +71,7 @@ private void Update() else { if (!bCanShootThisFrame) return; - m_ShootTimer = k_ShootTimer; + m_ShootTimer = Random.Range(k_ShootTimer - 0.05f, k_ShootTimer + 0.25f); SpawnBullet(); return; } @@ -42,14 +83,6 @@ private void SpawnBullet() myBullet.GetComponent().Spawn(); } - protected void OnDestroy() - { - if (!InvadersGame.Singleton) return; - - if (IsServer) InvadersGame.Singleton.UnregisterSpawnableObject(InvadersObjectType.Alien, gameObject); - InvadersGame.Singleton.isGameOver.OnValueChanged -= OnGameOver; - } - private void OnTriggerEnter2D(Collider2D collider) { if (!IsServer) return; @@ -58,22 +91,6 @@ private void OnTriggerEnter2D(Collider2D collider) if (hitShield != null) Destroy(hitShield.gameObject); } - public override void NetworkStart() - { - base.NetworkStart(); - - if (IsServer) - { - canShoot = false; - if (score == 100) - return; - - Assert.IsTrue(InvadersGame.Singleton); - InvadersGame.Singleton.RegisterSpawnableObject(InvadersObjectType.Alien, gameObject); - InvadersGame.Singleton.isGameOver.OnValueChanged += OnGameOver; - } - } - private void OnGameOver(bool oldValue, bool newValue) { // Is there anything we need to add in here? diff --git a/Basic/Invaders/Assets/Scripts/AlienInvader.cs.meta b/Basic/Invaders/Assets/Scripts/EnemyAgent.cs.meta similarity index 100% rename from Basic/Invaders/Assets/Scripts/AlienInvader.cs.meta rename to Basic/Invaders/Assets/Scripts/EnemyAgent.cs.meta diff --git a/Basic/Invaders/Assets/Scripts/AlienBullet.cs b/Basic/Invaders/Assets/Scripts/EnemyBullet.cs similarity index 97% rename from Basic/Invaders/Assets/Scripts/AlienBullet.cs rename to Basic/Invaders/Assets/Scripts/EnemyBullet.cs index 61d0ea81a..e848e2e65 100644 --- a/Basic/Invaders/Assets/Scripts/AlienBullet.cs +++ b/Basic/Invaders/Assets/Scripts/EnemyBullet.cs @@ -3,7 +3,7 @@ using UnityEngine; using UnityEngine.Assertions; -public class AlienBullet : MonoBehaviour +public class EnemyBullet : MonoBehaviour { private const float k_YBoundary = -4.0f; diff --git a/Basic/Invaders/Assets/Scripts/AlienBullet.cs.meta b/Basic/Invaders/Assets/Scripts/EnemyBullet.cs.meta similarity index 100% rename from Basic/Invaders/Assets/Scripts/AlienBullet.cs.meta rename to Basic/Invaders/Assets/Scripts/EnemyBullet.cs.meta diff --git a/Basic/Invaders/Assets/Scripts/InvadersGame.cs b/Basic/Invaders/Assets/Scripts/InvadersGame.cs index c6c2a35dd..46e78b5bc 100644 --- a/Basic/Invaders/Assets/Scripts/InvadersGame.cs +++ b/Basic/Invaders/Assets/Scripts/InvadersGame.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using MLAPI; using MLAPI.Connection; +using MLAPI.Messaging; using MLAPI.NetworkVariable; using TMPro; using UnityEngine; @@ -10,20 +11,41 @@ public enum InvadersObjectType { - Alien = 1, + Enemy = 1, Shield, Max } +[Flags] +public enum UpdateEnemiesResultFlags : byte +{ + None = 0x0000, + FoundEnemy = 0x0001, // Found at least one eligible enemy to continue, without creating a new set + ReachedHorizontalBoundary = 0x0002, // If at least one of the enemies reached either left or right boundary + ReachedBottom = 0x004, // If at least one of the enemies reached the bottom boundary the game is over + Max +} + +public enum GameOverReason : byte +{ + None = 0, + EnemiesReachedBottom = 1, + Death = 2, + Max, +} + public class InvadersGame : NetworkBehaviour { - // The vertical offset we apply to each Alien transform once they touch an edge - private const float k_AlienVerticalMovementOffset = -0.8f; + // The vertical offset we apply to each Enemy transform once they touch an edge + private const float k_EnemyVerticalMovementOffset = -0.8f; + private const float k_LeftOrRightBoundaryOffset = 10.0f; + private const float k_BottomBoundaryOffset = 1.25f; + [Header("Prefab settings")] - public GameObject alien1Prefab; - public GameObject alien2Prefab; - public GameObject alien3Prefab; - public GameObject saucerPrefab; + public GameObject enemy1Prefab; + public GameObject enemy2Prefab; + public GameObject enemy3Prefab; + public GameObject superEnemyPrefab; public GameObject shieldPrefab; [Header("UI Settings")] @@ -43,12 +65,12 @@ public class InvadersGame : NetworkBehaviour private NetworkVariableFloat m_TickPeriodic = new NetworkVariableFloat(0.2f); [SerializeField] - private NetworkVariableFloat m_AlienDirection = new NetworkVariableFloat(0.3f); + private NetworkVariableFloat m_EnemyMovingDirection = new NetworkVariableFloat(0.3f); [SerializeField] private float m_RandomThresholdForSaucerCreation = 0.92f; - private List m_Aliens = new List(); + private List m_Enemies = new List(); //These help to simplify checking server vs client //[NSS]: This would also be a great place to add a state machine and use networked vars for this @@ -127,7 +149,7 @@ protected void OnDestroy() { if (IsServer) { - m_Aliens.Clear(); + m_Enemies.Clear(); m_Shields.Clear(); } } @@ -268,90 +290,109 @@ private void UpdateGameTimer() /// /// OnGameStarted - /// Only invoked by the server, this hides the timer text and initializes the aliens and level + /// Only invoked by the server, this hides the timer text and initializes the enemies and level /// private void OnGameStarted() { gameTimerText.gameObject.SetActive(false); - CreateAliens(); + CreateEnemies(); CreateShields(); - CreateSaucer(); + CreateSuperEnemy(); } private void UpdateEnemies() { - // update aliens + // Update enemies if (Time.time >= m_NextTick) { m_NextTick = Time.time + m_TickPeriodic.Value; - var foundEdge = false; - var foundEligibleAlienEnemy = false; - UpdateShootingEnemies(ref foundEligibleAlienEnemy, ref foundEdge); + UpdateEnemiesResultFlags enemiesResultFlags = UpdateEnemiesResultFlags.None; + UpdateShootingEnemies(ref enemiesResultFlags); - if (!foundEligibleAlienEnemy) + if((enemiesResultFlags & UpdateEnemiesResultFlags.ReachedBottom) != 0) { - CreateAliens(); + // Force game end as at least one of the enemies have reached the bottom! + SetGameEnd(GameOverReason.EnemiesReachedBottom); + return; + } + + // If we didn't find any enemies, then spawn some + if ((enemiesResultFlags & UpdateEnemiesResultFlags.FoundEnemy) == 0) + { + CreateEnemies(); m_TickPeriodic.Value = 0.2f; } - if (foundEdge) + // If the enemies reached the either side of the boundaries, then change the movement direction + // And move them to the next row below + if ((enemiesResultFlags & UpdateEnemiesResultFlags.ReachedHorizontalBoundary) != 0) { - m_AlienDirection.Value = -m_AlienDirection.Value; + m_EnemyMovingDirection.Value = -m_EnemyMovingDirection.Value; m_TickPeriodic.Value *= 0.95f; // get faster - var aliensCount = m_Aliens.Count; - for (var index = 0; index < aliensCount; index++) + var enemiesCount = m_Enemies.Count; + for (var index = 0; index < enemiesCount; index++) { - var alien = m_Aliens[index]; - alien.transform.Translate(0, k_AlienVerticalMovementOffset, 0); + var enemy = m_Enemies[index]; + enemy.transform.Translate(0, k_EnemyVerticalMovementOffset, 0); } } if (m_Saucer == null) if (Random.Range(0, 1.0f) > m_RandomThresholdForSaucerCreation) - CreateSaucer(); + CreateSuperEnemy(); } } - private bool UpdateShootingEnemies(ref bool foundAlien, ref bool foundEdge) + private void UpdateShootingEnemies(ref UpdateEnemiesResultFlags flags) { - var aliensCount = m_Aliens.Count; - for (var index = 0; index < aliensCount; index++) + flags = UpdateEnemiesResultFlags.None; + var enemiesCount = m_Enemies.Count; + for (var index = 0; index < enemiesCount; index++) { - var alien = m_Aliens[index]; - Assert.IsTrue(alien); - - if (alien.score > 100) + var enemy = m_Enemies[index]; + Assert.IsNotNull(enemy); + if (m_Enemies == null) + { + continue; + } + + // If at least one of the enemies reached bottom, return early. + if (enemy.transform.position.y <= k_BottomBoundaryOffset) + { + flags |= UpdateEnemiesResultFlags.ReachedBottom; + return; + } + + if (enemy.score > 100) continue; - foundAlien = true; - alien.transform.position += new Vector3(m_AlienDirection.Value, 0, 0); + flags |= UpdateEnemiesResultFlags.FoundEnemy; + enemy.transform.position += new Vector3(m_EnemyMovingDirection.Value, 0, 0); - if (alien.transform.position.x > 10 || alien.transform.position.x < -10) - foundEdge = true; + if (enemy.transform.position.x > k_LeftOrRightBoundaryOffset || enemy.transform.position.x < -k_LeftOrRightBoundaryOffset) + flags |= UpdateEnemiesResultFlags.ReachedHorizontalBoundary; // can shoot if the lowest in my column var canShoot = true; - var column = alien.column; - var row = alien.row; - for (var otherIndex = 0; otherIndex < aliensCount; otherIndex++) + var column = enemy.column; + var row = enemy.row; + for (var otherIndex = 0; otherIndex < enemiesCount; otherIndex++) { - var otherAlien = m_Aliens[otherIndex]; - Assert.IsTrue(otherAlien != null); + var otherEnemy = m_Enemies[otherIndex]; + Assert.IsTrue(otherEnemy != null); - if (Math.Abs(otherAlien.column - column) < 0.001f) - if (otherAlien.row < row) + if (Math.Abs(otherEnemy.column - column) < 0.001f) + if (otherEnemy.row < row) { canShoot = false; break; } } - alien.canShoot = canShoot; + enemy.canShoot = canShoot; } - - return foundAlien; } public void SetScore(int score) @@ -366,27 +407,46 @@ public void SetLives(int lives) public void DisplayGameOverText(string message) { - if (gameOverText) gameOverText.gameObject.SetActive(true); + if (gameOverText) + { + gameOverText.SetText(message); + gameOverText.gameObject.SetActive(true); + } } - public void SetGameEnd(bool isGameOver) + public void SetGameEnd(GameOverReason reason) { Assert.IsTrue(IsServer, "SetGameEnd should only be called server side!"); // We should only end the game if all the player's are dead - if (isGameOver) + if (reason != GameOverReason.Death) { - foreach (NetworkClient networkedClient in NetworkManager.Singleton.ConnectedClientsList) - { - var playerObject = networkedClient.PlayerObject; - if(playerObject == null) continue; - - // We should just early out if any of the player's are still alive - if (playerObject.GetComponent().IsAlive) - return; - } + this.isGameOver.Value = true; + BroadcastGameOverClientRpc(reason); // Notify our clients! + return; + } + + foreach (NetworkClient networkedClient in NetworkManager.Singleton.ConnectedClientsList) + { + var playerObject = networkedClient.PlayerObject; + if(playerObject == null) continue; + + // We should just early out if any of the player's are still alive + if (playerObject.GetComponent().IsAlive) + return; } - this.isGameOver.Value = isGameOver; + + this.isGameOver.Value = true; + } + + [ClientRpc] + public void BroadcastGameOverClientRpc(GameOverReason reason) + { + var localPlayerObject = NetworkManager.Singleton.ConnectedClients[NetworkManager.Singleton.LocalClientId].PlayerObject; + Assert.IsNotNull(localPlayerObject); + + if (localPlayerObject.TryGetComponent(out var playerControl)) + playerControl.NotifyGameOver(reason); } public void RegisterSpawnableObject(InvadersObjectType invadersObjectType, GameObject gameObject) @@ -395,16 +455,16 @@ public void RegisterSpawnableObject(InvadersObjectType invadersObjectType, GameO switch (invadersObjectType) { - case InvadersObjectType.Alien: + case InvadersObjectType.Enemy: { // Don't register if this is a saucer - if (gameObject.TryGetComponent(out var saucer)) + if (gameObject.TryGetComponent(out var saucer)) return; - gameObject.TryGetComponent(out var alienInvader); - Assert.IsTrue(alienInvader != null); - if (!m_Aliens.Contains(alienInvader)) - m_Aliens.Add(alienInvader); + gameObject.TryGetComponent(out var enemyAgent); + Assert.IsTrue(enemyAgent != null); + if (!m_Enemies.Contains(enemyAgent)) + m_Enemies.Add(enemyAgent); break; } case InvadersObjectType.Shield: @@ -426,16 +486,16 @@ public void UnregisterSpawnableObject(InvadersObjectType invadersObjectType, Gam switch (invadersObjectType) { - case InvadersObjectType.Alien: + case InvadersObjectType.Enemy: { // Don't unregister if this is a saucer - if (gameObject.TryGetComponent(out var saucer)) + if (gameObject.TryGetComponent(out var saucer)) return; - gameObject.TryGetComponent(out var alienInvader); - Assert.IsTrue(alienInvader != null); - if (m_Aliens.Contains(alienInvader)) - Assert.IsTrue(m_Aliens.Remove(alienInvader)); + gameObject.TryGetComponent(out var enemyAgent); + Assert.IsTrue(enemyAgent != null); + if (m_Enemies.Contains(enemyAgent)) + m_Enemies.Remove(enemyAgent); break; } case InvadersObjectType.Shield: @@ -443,7 +503,7 @@ public void UnregisterSpawnableObject(InvadersObjectType invadersObjectType, Gam gameObject.TryGetComponent(out var shield); Assert.IsTrue(shield != null); if (m_Shields.Contains(shield)) - Assert.IsTrue(m_Shields.Remove(shield)); + m_Shields.Remove(shield); break; } default: @@ -497,48 +557,48 @@ private void CreateShields() CreateShield(shieldPrefab, 7, -1); } - private void CreateSaucer() + private void CreateSuperEnemy() { Assert.IsTrue(IsServer, "Create Saucer should be called server-side only!"); - m_Saucer = Instantiate(saucerPrefab, saucerSpawnPoint.position, Quaternion.identity); + m_Saucer = Instantiate(superEnemyPrefab, saucerSpawnPoint.position, Quaternion.identity); // Spawn the Networked Object, this should notify the clients m_Saucer.GetComponent().Spawn(); } - private void CreateAlien(GameObject prefab, float posX, float posY) + private void CreateEnemy(GameObject prefab, float posX, float posY) { - Assert.IsTrue(IsServer, "Create Alien should be called server-side only!"); + Assert.IsTrue(IsServer, "Create Enemy should be called server-side only!"); - var newAlien = Instantiate(prefab); - newAlien.transform.position = new Vector3(posX, posY, 0.0f); - newAlien.GetComponent().Setup(Mathf.RoundToInt(posX), Mathf.RoundToInt(posY)); + var enemy = Instantiate(prefab); + enemy.transform.position = new Vector3(posX, posY, 0.0f); + enemy.GetComponent().Setup(Mathf.RoundToInt(posX), Mathf.RoundToInt(posY)); // Spawn the Networked Object, this should notify the clients - newAlien.GetComponent().Spawn(); + enemy.GetComponent().Spawn(); } - public void CreateAliens() + public void CreateEnemies() { float startx = -8; for (var i = 0; i < 10; i++) { - CreateAlien(alien1Prefab, startx, 12); + CreateEnemy(enemy1Prefab, startx, 12); startx += 1.6f; } startx = -8; for (var i = 0; i < 10; i++) { - CreateAlien(alien2Prefab, startx, 10); + CreateEnemy(enemy2Prefab, startx, 10); startx += 1.6f; } startx = -8; for (var i = 0; i < 10; i++) { - CreateAlien(alien3Prefab, startx, 8); + CreateEnemy(enemy3Prefab, startx, 8); startx += 1.6f; } } diff --git a/Basic/Invaders/Assets/Scripts/LobbyControl.cs b/Basic/Invaders/Assets/Scripts/LobbyControl.cs index 1d2c66e3e..6e2e1cad1 100644 --- a/Basic/Invaders/Assets/Scripts/LobbyControl.cs +++ b/Basic/Invaders/Assets/Scripts/LobbyControl.cs @@ -12,6 +12,11 @@ public class LobbyControl : NetworkBehaviour [SerializeField] private string m_InGameSceneName = "InGame"; + + // Minimum player count required to transition to next level + [SerializeField] + private int m_MinimumPlayerCount = 2; + public Text LobbyText; private bool m_AllPlayersInLobby; @@ -84,8 +89,7 @@ private void GenerateUserStatsForLobby() /// private void UpdateAndCheckPlayersInLobby() { - //This is game preference, but I am assuming at least 2 players? - m_AllPlayersInLobby = m_ClientsInLobby.Count > 1; + m_AllPlayersInLobby = m_ClientsInLobby.Count >= m_MinimumPlayerCount; foreach (var clientLobbyStatus in m_ClientsInLobby) { diff --git a/Basic/Invaders/Assets/Scripts/PlayerBullet.cs b/Basic/Invaders/Assets/Scripts/PlayerBullet.cs index 4a7227008..9282a6165 100644 --- a/Basic/Invaders/Assets/Scripts/PlayerBullet.cs +++ b/Basic/Invaders/Assets/Scripts/PlayerBullet.cs @@ -26,12 +26,12 @@ private void OnTriggerEnter2D(Collider2D collider) if (!NetworkManager.Singleton.IsServer) return; - var hitAlien = collider.gameObject.GetComponent(); - if (hitAlien != null && owner) + var hitEnemy = collider.gameObject.GetComponent(); + if (hitEnemy != null && owner) { - owner.IncreasePlayerScore(hitAlien.score); + owner.IncreasePlayerScore(hitEnemy.score); - Destroy(hitAlien.gameObject); + Destroy(hitEnemy.gameObject); Destroy(gameObject); return; } diff --git a/Basic/Invaders/Assets/Scripts/PlayerControl.cs b/Basic/Invaders/Assets/Scripts/PlayerControl.cs index 73d5f233c..b6f9f8224 100644 --- a/Basic/Invaders/Assets/Scripts/PlayerControl.cs +++ b/Basic/Invaders/Assets/Scripts/PlayerControl.cs @@ -141,11 +141,18 @@ private void OnGameStartedChanged(bool previousValue, bool newValue) private void OnLivesChanged(int previousAmount, int currentAmount) { + // Hide graphics client side upon death + if(currentAmount <= 0 && IsClient && TryGetComponent(out var spriteRenderer)) + spriteRenderer.enabled = false; + if (!IsOwner) return; Debug.LogFormat("Lives {0} ", currentAmount); if (InvadersGame.Singleton != null) InvadersGame.Singleton.SetLives(m_Lives.Value); - if (m_Lives.Value <= 0) m_IsAlive = false; + if (m_Lives.Value <= 0) + { + m_IsAlive = false; + } } private void OnScoreChanged(int previousAmount, int currentAmount) @@ -154,6 +161,7 @@ private void OnScoreChanged(int previousAmount, int currentAmount) Debug.LogFormat("Score {0} ", currentAmount); if (InvadersGame.Singleton != null) InvadersGame.Singleton.SetScore(m_Score.Value); } // ReSharper disable Unity.PerformanceAnalysis + private void InGameUpdate() { if (!IsLocalPlayer || !IsOwner || !m_HasGameStarted) return; @@ -166,10 +174,11 @@ private void InGameUpdate() if (deltaX != 0) { var newMovement = new Vector3(deltaX, 0, 0); - transform.position = Vector3.MoveTowards(transform.position, transform.position + newMovement, m_MoveSpeed * Time.deltaTime); + transform.position = Vector3.MoveTowards(transform.position, + transform.position + newMovement, m_MoveSpeed * Time.deltaTime); } - if (Input.GetKey(KeyCode.Space)) ShootServerRPC(); + if (Input.GetKeyDown(KeyCode.Space)) ShootServerRPC(); } [ServerRpc] @@ -199,15 +208,46 @@ public void HitByBullet() m_IsAlive = false; m_MoveX.Value = 0; m_Lives.Value = 0; - InvadersGame.Singleton.SetGameEnd(true); - NotifyDeathClientRpc(m_OwnerRPCParams); + InvadersGame.Singleton.SetGameEnd(GameOverReason.Death); + NotifyGameOverClientRpc(GameOverReason.Death, m_OwnerRPCParams); + + // Hide graphics of this player object server-side. Note we don't want to destroy the object as it + // may stop the RPC's from reaching on the other side, as there is only one player controlled object + if (TryGetComponent(out var spriteRenderer)) + spriteRenderer.enabled = false; } } [ClientRpc] - public void NotifyDeathClientRpc(ClientRpcParams clientParams) + private void NotifyGameOverClientRpc(GameOverReason reason, ClientRpcParams clientParams) + { + NotifyGameOver(reason); + } + + /// + /// This should only be called locally, either through NotifyGameOverClientRpc or through the InvadersGame.BroadcastGameOverReason + /// + /// + /// + public void NotifyGameOver(GameOverReason reason) { + Assert.IsTrue(IsLocalPlayer); m_HasGameStarted = false; - InvadersGame.Singleton.DisplayGameOverText("You Are Dead!"); + switch (reason) + { + case GameOverReason.None: + InvadersGame.Singleton.DisplayGameOverText("You have lost! \n Unknown reason!"); + break; + case GameOverReason.EnemiesReachedBottom: + InvadersGame.Singleton.DisplayGameOverText("You have lost! \n The enemies have invaded you!"); + break; + case GameOverReason.Death: + InvadersGame.Singleton.DisplayGameOverText("You have lost! \n Your health was depleted!"); + break; + case GameOverReason.Max: + break; + default: + throw new ArgumentOutOfRangeException(nameof(reason), reason, null); + } } } diff --git a/Basic/Invaders/Assets/Scripts/Saucer.cs b/Basic/Invaders/Assets/Scripts/SuperEnemyMovement.cs similarity index 92% rename from Basic/Invaders/Assets/Scripts/Saucer.cs rename to Basic/Invaders/Assets/Scripts/SuperEnemyMovement.cs index db83894ac..0072706dd 100644 --- a/Basic/Invaders/Assets/Scripts/Saucer.cs +++ b/Basic/Invaders/Assets/Scripts/SuperEnemyMovement.cs @@ -2,7 +2,7 @@ using MLAPI; using UnityEngine; -public class Saucer : MonoBehaviour +public class SuperEnemyMovement : MonoBehaviour { private const float k_YBoundary = 14.0f; diff --git a/Basic/Invaders/Assets/Scripts/Saucer.cs.meta b/Basic/Invaders/Assets/Scripts/SuperEnemyMovement.cs.meta similarity index 100% rename from Basic/Invaders/Assets/Scripts/Saucer.cs.meta rename to Basic/Invaders/Assets/Scripts/SuperEnemyMovement.cs.meta diff --git a/Basic/Invaders/Assets/Sprites/alien1.jpg b/Basic/Invaders/Assets/Sprites/alien1.jpg deleted file mode 100644 index c54cf55e8..000000000 Binary files a/Basic/Invaders/Assets/Sprites/alien1.jpg and /dev/null differ diff --git a/Basic/Invaders/Assets/Sprites/alien2.jpg b/Basic/Invaders/Assets/Sprites/alien2.jpg deleted file mode 100644 index 1872a4943..000000000 Binary files a/Basic/Invaders/Assets/Sprites/alien2.jpg and /dev/null differ diff --git a/Basic/Invaders/Assets/Sprites/alien3.jpg b/Basic/Invaders/Assets/Sprites/alien3.jpg deleted file mode 100644 index eb4bcd623..000000000 Binary files a/Basic/Invaders/Assets/Sprites/alien3.jpg and /dev/null differ diff --git a/Basic/Invaders/Assets/Sprites/enemy1.png b/Basic/Invaders/Assets/Sprites/enemy1.png new file mode 100644 index 000000000..bc432ccf9 Binary files /dev/null and b/Basic/Invaders/Assets/Sprites/enemy1.png differ diff --git a/Basic/Invaders/Assets/Sprites/alien1.jpg.meta b/Basic/Invaders/Assets/Sprites/enemy1.png.meta similarity index 78% rename from Basic/Invaders/Assets/Sprites/alien1.jpg.meta rename to Basic/Invaders/Assets/Sprites/enemy1.png.meta index 0c2aaa444..8a5d67367 100644 --- a/Basic/Invaders/Assets/Sprites/alien1.jpg.meta +++ b/Basic/Invaders/Assets/Sprites/enemy1.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 46fc833f46553be4bae0ba363af8e5b7 +guid: 4ab7e7189ab754124aa83e1fa63dc0c2 TextureImporter: internalIDToNameTable: [] externalObjects: {} @@ -28,16 +28,16 @@ TextureImporter: generateCubemap: 6 cubemapConvolution: 0 seamlessCubemap: 0 - textureFormat: -1 - maxTextureSize: 1024 + textureFormat: 1 + maxTextureSize: 2048 textureSettings: serializedVersion: 2 - filterMode: -1 + filterMode: 1 aniso: 1 - mipBias: -100 + mipBias: 0 wrapU: 1 wrapV: 1 - wrapW: 1 + wrapW: 0 nPOTScale: 0 lightmap: 0 compressionQuality: 50 @@ -61,14 +61,26 @@ TextureImporter: compressionQualitySet: 0 textureFormatSet: 0 ignorePngGamma: 0 - applyGammaDecoding: 1 + applyGammaDecoding: 0 platformSettings: - serializedVersion: 3 buildTarget: DefaultTexturePlatform - maxTextureSize: 1024 + maxTextureSize: 2048 resizeAlgorithm: 0 textureFormat: -1 - textureCompression: 1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 compressionQuality: 50 crunchedCompression: 0 allowsAlphaSplitting: 0 diff --git a/Basic/Invaders/Assets/Sprites/enemy2.png b/Basic/Invaders/Assets/Sprites/enemy2.png new file mode 100644 index 000000000..1642c17bc Binary files /dev/null and b/Basic/Invaders/Assets/Sprites/enemy2.png differ diff --git a/Basic/Invaders/Assets/Sprites/alien2.jpg.meta b/Basic/Invaders/Assets/Sprites/enemy2.png.meta similarity index 78% rename from Basic/Invaders/Assets/Sprites/alien2.jpg.meta rename to Basic/Invaders/Assets/Sprites/enemy2.png.meta index 09ac58acc..972fcf7b0 100644 --- a/Basic/Invaders/Assets/Sprites/alien2.jpg.meta +++ b/Basic/Invaders/Assets/Sprites/enemy2.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: bb17efd32f1b62b47b9d3876d96c0b2c +guid: 6416b5a3e55ca443985a9882ff71d879 TextureImporter: internalIDToNameTable: [] externalObjects: {} @@ -28,16 +28,16 @@ TextureImporter: generateCubemap: 6 cubemapConvolution: 0 seamlessCubemap: 0 - textureFormat: -1 - maxTextureSize: 1024 + textureFormat: 1 + maxTextureSize: 2048 textureSettings: serializedVersion: 2 - filterMode: -1 + filterMode: 1 aniso: 1 - mipBias: -100 + mipBias: 0 wrapU: 1 wrapV: 1 - wrapW: 1 + wrapW: 0 nPOTScale: 0 lightmap: 0 compressionQuality: 50 @@ -61,14 +61,26 @@ TextureImporter: compressionQualitySet: 0 textureFormatSet: 0 ignorePngGamma: 0 - applyGammaDecoding: 1 + applyGammaDecoding: 0 platformSettings: - serializedVersion: 3 buildTarget: DefaultTexturePlatform - maxTextureSize: 1024 + maxTextureSize: 2048 resizeAlgorithm: 0 textureFormat: -1 - textureCompression: 1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 compressionQuality: 50 crunchedCompression: 0 allowsAlphaSplitting: 0 diff --git a/Basic/Invaders/Assets/Sprites/enemy3.png b/Basic/Invaders/Assets/Sprites/enemy3.png new file mode 100644 index 000000000..0e12a268e Binary files /dev/null and b/Basic/Invaders/Assets/Sprites/enemy3.png differ diff --git a/Basic/Invaders/Assets/Sprites/alien3.jpg.meta b/Basic/Invaders/Assets/Sprites/enemy3.png.meta similarity index 78% rename from Basic/Invaders/Assets/Sprites/alien3.jpg.meta rename to Basic/Invaders/Assets/Sprites/enemy3.png.meta index ad85efdb3..594f66918 100644 --- a/Basic/Invaders/Assets/Sprites/alien3.jpg.meta +++ b/Basic/Invaders/Assets/Sprites/enemy3.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 33ed2981c8de0d44b9881e822df7a931 +guid: b8a22d7f951c14967b823fdb049384a8 TextureImporter: internalIDToNameTable: [] externalObjects: {} @@ -28,16 +28,16 @@ TextureImporter: generateCubemap: 6 cubemapConvolution: 0 seamlessCubemap: 0 - textureFormat: -1 - maxTextureSize: 1024 + textureFormat: 1 + maxTextureSize: 2048 textureSettings: serializedVersion: 2 - filterMode: -1 + filterMode: 1 aniso: 1 - mipBias: -100 + mipBias: 0 wrapU: 1 wrapV: 1 - wrapW: 1 + wrapW: 0 nPOTScale: 0 lightmap: 0 compressionQuality: 50 @@ -61,14 +61,26 @@ TextureImporter: compressionQualitySet: 0 textureFormatSet: 0 ignorePngGamma: 0 - applyGammaDecoding: 1 + applyGammaDecoding: 0 platformSettings: - serializedVersion: 3 buildTarget: DefaultTexturePlatform - maxTextureSize: 1024 + maxTextureSize: 2048 resizeAlgorithm: 0 textureFormat: -1 - textureCompression: 1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 compressionQuality: 50 crunchedCompression: 0 allowsAlphaSplitting: 0 diff --git a/Basic/Invaders/Assets/Sprites/alienbullet.jpg b/Basic/Invaders/Assets/Sprites/enemybullet.jpg similarity index 100% rename from Basic/Invaders/Assets/Sprites/alienbullet.jpg rename to Basic/Invaders/Assets/Sprites/enemybullet.jpg diff --git a/Basic/Invaders/Assets/Sprites/alienbullet.jpg.meta b/Basic/Invaders/Assets/Sprites/enemybullet.jpg.meta similarity index 100% rename from Basic/Invaders/Assets/Sprites/alienbullet.jpg.meta rename to Basic/Invaders/Assets/Sprites/enemybullet.jpg.meta diff --git a/Basic/Invaders/Assets/Sprites/player ship.png b/Basic/Invaders/Assets/Sprites/player ship.png new file mode 100644 index 000000000..d489858ba Binary files /dev/null and b/Basic/Invaders/Assets/Sprites/player ship.png differ diff --git a/Basic/Invaders/Assets/Sprites/player.jpg.meta b/Basic/Invaders/Assets/Sprites/player ship.png.meta similarity index 78% rename from Basic/Invaders/Assets/Sprites/player.jpg.meta rename to Basic/Invaders/Assets/Sprites/player ship.png.meta index bcc3e89b3..4a82e5cb3 100644 --- a/Basic/Invaders/Assets/Sprites/player.jpg.meta +++ b/Basic/Invaders/Assets/Sprites/player ship.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6e31b7ae591614d4396749e68a6ba020 +guid: ccc6b3ea84f7e4550b618abc8d06dd5d TextureImporter: internalIDToNameTable: [] externalObjects: {} @@ -28,16 +28,16 @@ TextureImporter: generateCubemap: 6 cubemapConvolution: 0 seamlessCubemap: 0 - textureFormat: -1 - maxTextureSize: 1024 + textureFormat: 1 + maxTextureSize: 2048 textureSettings: serializedVersion: 2 - filterMode: -1 + filterMode: 1 aniso: 1 - mipBias: -100 + mipBias: 0 wrapU: 1 wrapV: 1 - wrapW: 1 + wrapW: 0 nPOTScale: 0 lightmap: 0 compressionQuality: 50 @@ -61,14 +61,26 @@ TextureImporter: compressionQualitySet: 0 textureFormatSet: 0 ignorePngGamma: 0 - applyGammaDecoding: 1 + applyGammaDecoding: 0 platformSettings: - serializedVersion: 3 buildTarget: DefaultTexturePlatform - maxTextureSize: 1024 + maxTextureSize: 2048 resizeAlgorithm: 0 textureFormat: -1 - textureCompression: 1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 compressionQuality: 50 crunchedCompression: 0 allowsAlphaSplitting: 0 diff --git a/Basic/Invaders/Assets/Sprites/player.jpg b/Basic/Invaders/Assets/Sprites/player.jpg deleted file mode 100644 index d7fcb8af1..000000000 Binary files a/Basic/Invaders/Assets/Sprites/player.jpg and /dev/null differ diff --git a/Basic/Invaders/Assets/Sprites/saucer.png b/Basic/Invaders/Assets/Sprites/saucer.png new file mode 100644 index 000000000..6834ad25b Binary files /dev/null and b/Basic/Invaders/Assets/Sprites/saucer.png differ diff --git a/Basic/Invaders/Assets/Sprites/saucer.png.meta b/Basic/Invaders/Assets/Sprites/saucer.png.meta new file mode 100644 index 000000000..5c63476c0 --- /dev/null +++ b/Basic/Invaders/Assets/Sprites/saucer.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 4814484f2408640ddb51647c66bdbc8e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Basic/Invaders/Assets/Sprites/saucerr.jpg b/Basic/Invaders/Assets/Sprites/saucerr.jpg deleted file mode 100644 index 4f2eb4cdd..000000000 Binary files a/Basic/Invaders/Assets/Sprites/saucerr.jpg and /dev/null differ diff --git a/Basic/Invaders/Assets/Sprites/saucerr.jpg.meta b/Basic/Invaders/Assets/Sprites/saucerr.jpg.meta deleted file mode 100644 index 7b9ab043c..000000000 --- a/Basic/Invaders/Assets/Sprites/saucerr.jpg.meta +++ /dev/null @@ -1,96 +0,0 @@ -fileFormatVersion: 2 -guid: 9b0a23d4f4a4b5f4dad77b73d477aec2 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 11 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: -1 - maxTextureSize: 1024 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: 1 - mipBias: -100 - wrapU: 1 - wrapV: 1 - wrapW: 1 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 8 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 1 - platformSettings: - - serializedVersion: 3 - buildTarget: DefaultTexturePlatform - maxTextureSize: 1024 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Basic/Invaders/Packages/manifest.json b/Basic/Invaders/Packages/manifest.json index 41ddeaf1c..1008a3b8f 100644 --- a/Basic/Invaders/Packages/manifest.json +++ b/Basic/Invaders/Packages/manifest.json @@ -1,11 +1,11 @@ { "dependencies": { "com.unity.ide.rider": "2.0.7", - "com.unity.ide.visualstudio": "2.0.7", + "com.unity.ide.visualstudio": "2.0.9", "com.unity.ide.vscode": "1.2.3", "com.unity.multiplayer.mlapi": "https://github.com/Unity-Technologies/com.unity.multiplayer.mlapi.git?path=/com.unity.multiplayer.mlapi#release/0.1.0", - "com.unity.textmeshpro": "3.0.3", - "com.unity.timeline": "1.4.7", + "com.unity.textmeshpro": "3.0.6", + "com.unity.timeline": "1.4.8", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.animation": "1.0.0", diff --git a/Basic/Invaders/Packages/packages-lock.json b/Basic/Invaders/Packages/packages-lock.json index d14b780ee..351e1ddb8 100644 --- a/Basic/Invaders/Packages/packages-lock.json +++ b/Basic/Invaders/Packages/packages-lock.json @@ -17,7 +17,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.7", + "version": "2.0.9", "depth": 0, "source": "registry", "dependencies": { @@ -49,7 +49,7 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework": { - "version": "1.1.24", + "version": "1.1.26", "depth": 1, "source": "registry", "dependencies": { @@ -60,7 +60,7 @@ "url": "https://packages.unity.com" }, "com.unity.textmeshpro": { - "version": "3.0.3", + "version": "3.0.6", "depth": 0, "source": "registry", "dependencies": { @@ -69,7 +69,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.4.7", + "version": "1.4.8", "depth": 0, "source": "registry", "dependencies": { diff --git a/Basic/Invaders/ProjectSettings/ProjectSettings.asset b/Basic/Invaders/ProjectSettings/ProjectSettings.asset index da660cef6..8de9eb411 100644 --- a/Basic/Invaders/ProjectSettings/ProjectSettings.asset +++ b/Basic/Invaders/ProjectSettings/ProjectSettings.asset @@ -264,7 +264,7 @@ PlayerSettings: - m_BuildTarget: m_Icons: - serializedVersion: 2 - m_Icon: {fileID: 2800000, guid: 33ed2981c8de0d44b9881e822df7a931, type: 3} + m_Icon: {fileID: 2800000, guid: 6416b5a3e55ca443985a9882ff71d879, type: 3} m_Width: 128 m_Height: 128 m_Kind: 0 @@ -546,6 +546,7 @@ PlayerSettings: ps4videoRecordingFeaturesUsed: 0 ps4contentSearchFeaturesUsed: 0 ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 ps4GPU800MHz: 1 ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] diff --git a/Basic/Invaders/ProjectSettings/ProjectVersion.txt b/Basic/Invaders/ProjectSettings/ProjectVersion.txt index 8c1bcbd3b..95c2fc987 100644 --- a/Basic/Invaders/ProjectSettings/ProjectVersion.txt +++ b/Basic/Invaders/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2020.3.7f1 -m_EditorVersionWithRevision: 2020.3.7f1 (dd97f2c94397) +m_EditorVersion: 2020.3.13f1 +m_EditorVersionWithRevision: 2020.3.13f1 (71691879b7f5) diff --git a/Basic/Invaders/UserSettings/EditorUserSettings.asset b/Basic/Invaders/UserSettings/EditorUserSettings.asset index fbd638e8d..6da29bc5e 100644 --- a/Basic/Invaders/UserSettings/EditorUserSettings.asset +++ b/Basic/Invaders/UserSettings/EditorUserSettings.asset @@ -6,8 +6,17 @@ EditorUserSettings: serializedVersion: 4 m_ConfigSettings: RecentlyUsedScenePath-0: + value: 22424703114646680e0b0227036c761e3116152f623d28393930 + flags: 0 + RecentlyUsedScenePath-1: value: 22424703114646680e0b0227036c761e1f033a25233c15243f280d7df7ee3d2cfb flags: 0 + RecentlyUsedScenePath-2: + value: 22424703114646680e0b0227036c761e00161c2f3e3b0a3f2f2b047df7ee3d2cfb + flags: 0 + RecentlyUsedScenePath-3: + value: 22424703114646680e0b0227036c6c0417050c072926337e38271427fb + flags: 0 vcSharedLogLevel: value: 0d5e400f0650 flags: 0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 88817dcba..a5ded1f30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Change log +## Invaders - 2021-07-20 + +### New Changes + +- Game - rename all our alien prefabs to have a more generic name, the same principle was applied to our codebase, renamed variables/fields/classes to something more generic +- Game: Fix a crash in shipping build +- Enemies: Rename our main enemy class to EnemyAgent + minor clean-ups + implement a grace shoot timer period +- InvadersGame: Some big refactories here, the UpdateEnemies function not outputs a set of flags (bitmask) rather than having separated booleans to keep track off +- InvadersGame: Fix an edge case of the game loop where if the enemies would reach the bottom they would never respawn, now when they do reach that bottom boundary it will be game over +- InvadersGame: Introduce additional game over reasons +- LobbyControl: Introduce a minimum player count variable that could be tweaked in the inspector so that the users can start playing in the editor with just the host in the lobby +- PlayerControl: Unified the NotifyGameOver function with the InvadersGame one + added different texts for all the possible game over reasons to be displayed +- PlayerControl: Fix a minor issue where the Player graphics are not hidden on all connected instances upon "death". + +### Known Issues + +- Upon import a MissingReferenceException is triggered from within MLAPI: **"MissingReferenceException: The object of type ‘GameObject’ has been destroyed but you are still trying to access it. + Your script should either check if it is null or you should not destroy the object."** in: + - UnityEngine.GameObject.GetComponent[T] () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/GameObject.bindings.cs:28) + ## [0.1.0] - 2021-04-07 Initial release of MLAPI Bitesize Samples repository. Samples support the following versions: