From 5dba727993745cead19d9b2c7315a342432f0b7f Mon Sep 17 00:00:00 2001 From: Cheonseo Lee <137674190+BeepBeepMaeae@users.noreply.github.com> Date: Sat, 7 Mar 2026 02:41:21 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat(#47):=20=EC=82=AC=EB=B3=B4=ED=83=80?= =?UTF-8?q?=EC=A7=80=20UI=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01. Scripts/Network/PlayerElimination.cs | 2 +- .../Sabotage/SpectatorSabotageController.cs | 38 +- GGJ26/Assets/01. Scripts/UI/GameManager.cs | 15 + GGJ26/Assets/01. Scripts/UI/UIDead.cs | 17 +- .../01. Scripts/UI/UISpectatorSabotageHud.cs | 344 ++++++++++++++++++ 5 files changed, 407 insertions(+), 9 deletions(-) create mode 100644 GGJ26/Assets/01. Scripts/UI/UISpectatorSabotageHud.cs diff --git a/GGJ26/Assets/01. Scripts/Network/PlayerElimination.cs b/GGJ26/Assets/01. Scripts/Network/PlayerElimination.cs index 7d709d91..dff04b08 100644 --- a/GGJ26/Assets/01. Scripts/Network/PlayerElimination.cs +++ b/GGJ26/Assets/01. Scripts/Network/PlayerElimination.cs @@ -208,7 +208,7 @@ private void ApplyEliminatedState() { spectatorSabotageController.SetSpectatorAimOrigin(spectatorController.transform); } - if (_playerRole != null && !_playerRole.IsSeeker) + if (_playerRole != null && _playerRole.IsSeeker == false) { var deadUI = FindFirstObjectByType(); if (deadUI != null) diff --git a/GGJ26/Assets/01. Scripts/Network/Sabotage/SpectatorSabotageController.cs b/GGJ26/Assets/01. Scripts/Network/Sabotage/SpectatorSabotageController.cs index d17bd2db..593583c0 100644 --- a/GGJ26/Assets/01. Scripts/Network/Sabotage/SpectatorSabotageController.cs +++ b/GGJ26/Assets/01. Scripts/Network/Sabotage/SpectatorSabotageController.cs @@ -17,14 +17,16 @@ public class SpectatorSabotageController : NetworkBehaviour [Header("Shoe Toss")] [SerializeField] private Object shoeProjectilePrefab; + [SerializeField] private string shoeTemplateObjectName = "Shoe"; [SerializeField] private float shoeStunSeconds = 0.5f; [SerializeField] private float shoeKnockbackSpeed = 2.4f; - [SerializeField] private float shoeProjectileSpeed = 18f; + [SerializeField] private float shoeProjectileSpeed = 24f; [SerializeField] private float shoeProjectileLifetime = 1.2f; - [SerializeField] private float shoeProjectileGravity = 9.8f; + [SerializeField] private float shoeProjectileGravity = 4.2f; [SerializeField] private float shoeSpawnForwardOffset = 0.8f; [SerializeField] private float shoeHitRadius = 0.45f; [SerializeField] private float shoeHitDistance = 22f; + [SerializeField] private Vector3 shoeSpinDegreesPerSecond = new Vector3(1080f, 540f, 720f); [Header("Ghost Smoke")] [SerializeField] private Object ghostSmokePrefab; @@ -59,6 +61,7 @@ public class SpectatorSabotageController : NetworkBehaviour private void Awake() { elimination = GetComponent(); + TryAutoAssignShoeProjectilePrefab(); TryAutoAssignGhostSmokePrefab(); ResolveCrosshairReferences(); } @@ -452,7 +455,11 @@ private bool TryResolveShoeProjectilePrefab(out GameObject prefab) prefab = null; if (shoeProjectilePrefab == null) { - return false; + TryAutoAssignShoeProjectilePrefab(); + if (shoeProjectilePrefab == null) + { + return false; + } } if (shoeProjectilePrefab is GameObject asGameObject) @@ -470,6 +477,27 @@ private bool TryResolveShoeProjectilePrefab(out GameObject prefab) return false; } + private void TryAutoAssignShoeProjectilePrefab() + { + if (string.IsNullOrWhiteSpace(shoeTemplateObjectName)) + { + return; + } + + var found = GameObject.Find(shoeTemplateObjectName); + if (found == null) + { + return; + } + + shoeProjectilePrefab = found; + + if (enableDebugLogs) + { + Debug.Log($"[Sabotage] Auto assigned shoe projectile template: {found.name}", this); + } + } + [Rpc(RpcSources.StateAuthority, RpcTargets.All)] private void RpcPlayPhantomDance(NetworkId npcId, int danceIndex, float duration) { @@ -649,6 +677,7 @@ private IEnumerator MoveShoeProjectile(Transform projectile, Vector3 direction, float remaining = Mathf.Max(0.05f, lifetime); Vector3 velocity = (direction.sqrMagnitude > 0.0001f ? direction.normalized : Vector3.forward) * Mathf.Max(0.1f, speed); float gravity = Mathf.Max(0f, shoeProjectileGravity); + Vector3 spin = shoeSpinDegreesPerSecond; bool canApplyHit = Object != null && Object.HasStateAuthority; while (projectile != null && remaining > 0f) @@ -659,7 +688,8 @@ private IEnumerator MoveShoeProjectile(Transform projectile, Vector3 direction, projectile.position += velocity * dt; if (velocity.sqrMagnitude > 0.0001f) { - projectile.rotation = Quaternion.LookRotation(velocity.normalized, Vector3.up); + Quaternion travelRotation = Quaternion.LookRotation(velocity.normalized, Vector3.up); + projectile.rotation = travelRotation * Quaternion.Euler(spin * (lifetime - remaining)); } if (canApplyHit && TryApplyShoeHit(prevPos, projectile.position, velocity)) diff --git a/GGJ26/Assets/01. Scripts/UI/GameManager.cs b/GGJ26/Assets/01. Scripts/UI/GameManager.cs index e20a77fc..e293d471 100644 --- a/GGJ26/Assets/01. Scripts/UI/GameManager.cs +++ b/GGJ26/Assets/01. Scripts/UI/GameManager.cs @@ -151,6 +151,21 @@ private void OnPlayerStateChanged(PlayerState updatedState) Debug.Log($"[GameManager] Local player is known. Local ID: {localState.PlayerId}. Comparing with updated ID: {updatedState.PlayerId}."); if (updatedState.PlayerId == localState.PlayerId) { + if (updatedState.IsDead) + { + Debug.Log($"[GameManager] Local player death state received. IsSeeker={updatedState.IsSeeker}"); + if (updatedState.IsSeeker == false) + { + var deadUI = FindFirstObjectByType(); + if (deadUI != null) + { + deadUI.ShowDeadUI(); + } + } + + return; + } + if (uiCanvasManager != null) { Debug.Log($"[GameManager] Confirmed local player state change. Role is now Seeker = {updatedState.IsSeeker}. Updating UI."); diff --git a/GGJ26/Assets/01. Scripts/UI/UIDead.cs b/GGJ26/Assets/01. Scripts/UI/UIDead.cs index c4ebbe7c..7f5de012 100644 --- a/GGJ26/Assets/01. Scripts/UI/UIDead.cs +++ b/GGJ26/Assets/01. Scripts/UI/UIDead.cs @@ -1,4 +1,3 @@ -using System.ComponentModel; using UnityEngine; public class UIDead : MonoBehaviour @@ -9,7 +8,17 @@ public class UIDead : MonoBehaviour public void ShowDeadUI() { Debug.Log("Showing Dead UI"); - foreach (var c in notDeadCanvas) c.enabled = false; - CanvasDead.enabled = true; + foreach (var c in notDeadCanvas) + { + if (c != null) + { + c.enabled = false; + } + } + + if (CanvasDead != null) + { + CanvasDead.enabled = true; + } } -} \ No newline at end of file +} diff --git a/GGJ26/Assets/01. Scripts/UI/UISpectatorSabotageHud.cs b/GGJ26/Assets/01. Scripts/UI/UISpectatorSabotageHud.cs new file mode 100644 index 00000000..c6a337a6 --- /dev/null +++ b/GGJ26/Assets/01. Scripts/UI/UISpectatorSabotageHud.cs @@ -0,0 +1,344 @@ +using Fusion; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +public class UISpectatorSabotageHud : MonoBehaviour +{ + private const string RootName = "SabotageHudRuntime"; + + [Header("Sprites")] + [SerializeField] private Sprite shoeSprite; + [SerializeField] private Sprite smokeSprite; + [SerializeField] private Sprite danceSprite; + [SerializeField] private Sprite keyOneSprite; + [SerializeField] private Sprite keyTwoSprite; + [SerializeField] private Sprite keyThreeSprite; + + [Header("Layout")] + [SerializeField] private Vector2 rootAnchoredPosition = new Vector2(0f, 96f); + [SerializeField] private Vector2 iconSize = new Vector2(120f, 120f); + [SerializeField] private Vector2 keySize = new Vector2(42f, 56f); + [SerializeField] private float slotSpacing = 150f; + [SerializeField] private Vector2 keyOffset = new Vector2(0f, -12f); + [SerializeField] private Vector2 titleOffset = new Vector2(0f, 150f); + [SerializeField] private float titleFontSize = 36f; + + [Header("Style")] + [SerializeField] private Color availableColor = Color.white; + [SerializeField] private Color usedColor = new Color(1f, 1f, 1f, 0.28f); + [SerializeField] private Color selectedOutlineColor = new Color(1f, 0.3f, 0.3f, 1f); + [SerializeField] private Color idleOutlineColor = new Color(0f, 0f, 0f, 0f); + [SerializeField] private Vector2 outlineDistance = new Vector2(6f, 6f); + + private SpectatorSabotageController sabotageController; + private RectTransform root; + private SlotView[] slots; + private TextMeshProUGUI titleLabel; + + private void Awake() + { + EnsureHud(); + } + + private void OnEnable() + { + EnsureHud(); + RefreshView(); + } + + private void Update() + { + if (root == null) + { + EnsureHud(); + } + + ResolveController(); + RefreshView(); + } + + private void EnsureHud() + { + if (root != null) + { + return; + } + + var existing = transform.Find(RootName) as RectTransform; + if (existing != null) + { + root = existing; + slots = CollectExistingSlots(existing); + titleLabel = existing.Find("Title")?.GetComponent(); + return; + } + + var rootObject = new GameObject(RootName, typeof(RectTransform)); + rootObject.transform.SetParent(transform, false); + root = rootObject.GetComponent(); + root.anchorMin = new Vector2(0.5f, 0f); + root.anchorMax = new Vector2(0.5f, 0f); + root.pivot = new Vector2(0.5f, 0f); + root.anchoredPosition = rootAnchoredPosition; + root.sizeDelta = new Vector2(slotSpacing * 2f + iconSize.x, iconSize.y + 80f); + + titleLabel = CreateTitle(root); + + slots = new SlotView[3]; + slots[0] = CreateSlot(root, "ShoeSlot", shoeSprite, keyOneSprite, -slotSpacing, "1"); + slots[1] = CreateSlot(root, "SmokeSlot", smokeSprite, keyTwoSprite, 0f, "2"); + slots[2] = CreateSlot(root, "DanceSlot", danceSprite, keyThreeSprite, slotSpacing, "3"); + } + + private SlotView[] CollectExistingSlots(RectTransform parent) + { + var collected = new SlotView[3]; + for (int i = 0; i < parent.childCount && i < 3; i++) + { + var child = parent.GetChild(i) as RectTransform; + if (child == null) + { + continue; + } + + collected[i] = new SlotView + { + root = child, + iconImage = child.Find("Icon")?.GetComponent(), + keyImage = child.Find("Key")?.GetComponent(), + keyText = child.Find("KeyText")?.GetComponent(), + outline = child.GetComponent() + }; + } + return collected; + } + + private TextMeshProUGUI CreateTitle(RectTransform parent) + { + var titleObject = new GameObject("Title", typeof(RectTransform), typeof(TextMeshProUGUI)); + titleObject.transform.SetParent(parent, false); + + var titleRect = titleObject.GetComponent(); + titleRect.anchorMin = new Vector2(0.5f, 0f); + titleRect.anchorMax = new Vector2(0.5f, 0f); + titleRect.pivot = new Vector2(0.5f, 0f); + titleRect.anchoredPosition = titleOffset; + titleRect.sizeDelta = new Vector2(400f, 48f); + + var label = titleObject.GetComponent(); + label.text = "Sabotage"; + label.alignment = TextAlignmentOptions.Center; + label.fontSize = titleFontSize; + label.raycastTarget = false; + + ApplyDeadTitleStyle(label); + return label; + } + + private void ApplyDeadTitleStyle(TextMeshProUGUI label) + { + var deadTitle = FindDeadTitleTemplate(); + if (deadTitle == null) + { + label.color = new Color32(255, 238, 159, 255); + return; + } + + label.font = deadTitle.font; + label.fontSharedMaterial = deadTitle.fontSharedMaterial; + label.color = deadTitle.color; + label.fontStyle = deadTitle.fontStyle; + label.enableWordWrapping = false; + label.outlineWidth = deadTitle.outlineWidth; + label.outlineColor = deadTitle.outlineColor; + label.characterSpacing = deadTitle.characterSpacing; + } + + private static TextMeshProUGUI FindDeadTitleTemplate() + { + var texts = FindObjectsByType(FindObjectsSortMode.None); + for (int i = 0; i < texts.Length; i++) + { + if (texts[i] != null && texts[i].name == "txtDead") + { + return texts[i]; + } + } + + return null; + } + + private SlotView CreateSlot(RectTransform parent, string name, Sprite iconSprite, Sprite keySprite, float xOffset, string fallbackKeyText) + { + var slotObject = new GameObject(name, typeof(RectTransform), typeof(Image), typeof(Outline)); + slotObject.transform.SetParent(parent, false); + + var slotRect = slotObject.GetComponent(); + slotRect.anchorMin = new Vector2(0.5f, 0f); + slotRect.anchorMax = new Vector2(0.5f, 0f); + slotRect.pivot = new Vector2(0.5f, 0f); + slotRect.anchoredPosition = new Vector2(xOffset, 0f); + slotRect.sizeDelta = iconSize; + + var background = slotObject.GetComponent(); + background.color = new Color(0f, 0f, 0f, 0.3f); + background.raycastTarget = false; + + var outline = slotObject.GetComponent(); + outline.effectColor = idleOutlineColor; + outline.effectDistance = outlineDistance; + + var iconObject = new GameObject("Icon", typeof(RectTransform), typeof(Image)); + iconObject.transform.SetParent(slotObject.transform, false); + var iconRect = iconObject.GetComponent(); + iconRect.anchorMin = Vector2.zero; + iconRect.anchorMax = Vector2.one; + iconRect.offsetMin = Vector2.zero; + iconRect.offsetMax = Vector2.zero; + var iconImage = iconObject.GetComponent(); + iconImage.sprite = iconSprite; + iconImage.preserveAspect = true; + iconImage.raycastTarget = false; + + var keyObject = new GameObject("Key", typeof(RectTransform), typeof(Image)); + keyObject.transform.SetParent(slotObject.transform, false); + var keyRect = keyObject.GetComponent(); + keyRect.anchorMin = new Vector2(0.5f, 0f); + keyRect.anchorMax = new Vector2(0.5f, 0f); + keyRect.pivot = new Vector2(0.5f, 1f); + keyRect.anchoredPosition = keyOffset; + keyRect.sizeDelta = keySize; + var keyImage = keyObject.GetComponent(); + keyImage.sprite = keySprite; + keyImage.preserveAspect = true; + keyImage.raycastTarget = false; + + var textObject = new GameObject("KeyText", typeof(RectTransform), typeof(Text)); + textObject.transform.SetParent(keyObject.transform, false); + var textRect = textObject.GetComponent(); + textRect.anchorMin = Vector2.zero; + textRect.anchorMax = Vector2.one; + textRect.offsetMin = Vector2.zero; + textRect.offsetMax = Vector2.zero; + var keyText = textObject.GetComponent(); + keyText.text = fallbackKeyText; + keyText.alignment = TextAnchor.MiddleCenter; + keyText.color = new Color(0.95f, 0.9f, 0.8f, 1f); + keyText.fontSize = 26; + keyText.font = Resources.GetBuiltinResource("LegacyRuntime.ttf"); + keyText.raycastTarget = false; + keyText.enabled = keySprite == null; + + return new SlotView + { + root = slotRect, + iconImage = iconImage, + keyImage = keyImage, + keyText = keyText, + outline = outline + }; + } + + private void ResolveController() + { + if (sabotageController != null && sabotageController.Object != null && sabotageController.Object.HasInputAuthority) + { + return; + } + + sabotageController = null; + var controllers = FindObjectsByType(FindObjectsSortMode.None); + for (int i = 0; i < controllers.Length; i++) + { + var candidate = controllers[i]; + if (candidate == null || candidate.Object == null) + { + continue; + } + + if (candidate.Object.HasInputAuthority) + { + sabotageController = candidate; + break; + } + } + } + + private void RefreshView() + { + if (slots == null || slots.Length < 3) + { + return; + } + + bool hasController = sabotageController != null; + bool show = false; + SabotageType armed = SabotageType.None; + + bool canUseShoe = false; + bool canUseSmoke = false; + bool canUseDance = false; + + if (hasController) + { + armed = sabotageController.ArmedType; + canUseShoe = sabotageController.CanUseShoe; + canUseSmoke = sabotageController.CanUseSmoke; + canUseDance = sabotageController.CanUseDance; + show = sabotageController.enabled && sabotageController.gameObject.activeInHierarchy; + } + + if (root != null) + { + root.gameObject.SetActive(show); + } + + if (show == false) + { + return; + } + + ApplySlotState(slots[0], canUseShoe, armed == SabotageType.ShoeToss); + ApplySlotState(slots[1], canUseSmoke, armed == SabotageType.GhostSmoke); + ApplySlotState(slots[2], canUseDance, armed == SabotageType.PhantomDance); + } + + private void ApplySlotState(SlotView slot, bool isAvailable, bool isSelected) + { + if (slot == null) + { + return; + } + + if (slot.iconImage != null) + { + slot.iconImage.color = isAvailable ? availableColor : usedColor; + } + + if (slot.keyImage != null) + { + slot.keyImage.color = isAvailable ? availableColor : usedColor; + } + + if (slot.keyText != null) + { + slot.keyText.color = isAvailable ? availableColor : usedColor; + slot.keyText.enabled = slot.keyImage == null || slot.keyImage.sprite == null; + } + + if (slot.outline != null) + { + slot.outline.effectColor = isSelected ? selectedOutlineColor : idleOutlineColor; + } + } + + private sealed class SlotView + { + public RectTransform root; + public Image iconImage; + public Image keyImage; + public Text keyText; + public Outline outline; + } +} From a8b69d47d4dc53b699b9b5a613715c6a6df74575 Mon Sep 17 00:00:00 2001 From: Cheonseo Lee <137674190+BeepBeepMaeae@users.noreply.github.com> Date: Sat, 7 Mar 2026 02:42:15 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat(#47):=20=EC=82=AC=EB=B3=B4=ED=83=80?= =?UTF-8?q?=EC=A7=80=20UI=20=EA=B5=AC=ED=98=84=20(=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A6=BD=ED=8A=B8=20=EC=99=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GGJ26/Assets/00. Scenes/GameScene.unity | 32 ++++- .../UI/UISpectatorSabotageHud.cs.meta | 2 + .../Effects/SabotageShoeProjectile.prefab | 110 ------------------ GGJ26/Assets/03. Prefabs/Effects/Shoe.prefab | 89 ++++++++++++++ ...rojectile.prefab.meta => Shoe.prefab.meta} | 2 +- .../03. Prefabs/Player/PlayerArmature.prefab | 6 +- .../Player/PlayerArmature_Normal.prefab | 6 +- .../Player/PlayerArmature_Seeker.prefab | 6 +- .../Prefabs/PlayerArmature_Normal.prefab | 3 +- .../TutorialInfo.meta | 0 .../TutorialInfo/Icons.meta | 0 .../TutorialInfo/Icons/ReadMeImg.PNG | Bin .../TutorialInfo/Icons/ReadMeImg.PNG.meta | 0 13 files changed, 137 insertions(+), 119 deletions(-) create mode 100644 GGJ26/Assets/01. Scripts/UI/UISpectatorSabotageHud.cs.meta delete mode 100644 GGJ26/Assets/03. Prefabs/Effects/SabotageShoeProjectile.prefab create mode 100644 GGJ26/Assets/03. Prefabs/Effects/Shoe.prefab rename GGJ26/Assets/03. Prefabs/Effects/{SabotageShoeProjectile.prefab.meta => Shoe.prefab.meta} (74%) rename GGJ26/Assets/StarterAssets/{ => ThirdPersonController}/TutorialInfo.meta (100%) rename GGJ26/Assets/StarterAssets/{ => ThirdPersonController}/TutorialInfo/Icons.meta (100%) rename GGJ26/Assets/StarterAssets/{ => ThirdPersonController}/TutorialInfo/Icons/ReadMeImg.PNG (100%) rename GGJ26/Assets/StarterAssets/{ => ThirdPersonController}/TutorialInfo/Icons/ReadMeImg.PNG.meta (100%) diff --git a/GGJ26/Assets/00. Scenes/GameScene.unity b/GGJ26/Assets/00. Scenes/GameScene.unity index d5af1aca..9670de9e 100644 --- a/GGJ26/Assets/00. Scenes/GameScene.unity +++ b/GGJ26/Assets/00. Scenes/GameScene.unity @@ -284,6 +284,7 @@ GameObject: - component: {fileID: 106689027} - component: {fileID: 106689026} - component: {fileID: 106689029} + - component: {fileID: 106689030} m_Layer: 0 m_Name: Dead m_TagString: Untagged @@ -392,6 +393,36 @@ MonoBehaviour: notDeadCanvas: - {fileID: 1227170226} - {fileID: 1227170227} +--- !u!114 &106689030 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106689024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c9b5e9a87a424d749c1d7f9f8e6a1b21, type: 3} + m_Name: + m_EditorClassIdentifier: + shoeSprite: {fileID: 21300000, guid: dfc97fc3e93a3fa43b8e5851f0ab29e4, type: 3} + smokeSprite: {fileID: 21300000, guid: 0be056719137a61479e5950dea34b7f4, type: 3} + danceSprite: {fileID: 21300000, guid: e7380c03ebdfd6948a716a5c06b4487b, type: 3} + keyOneSprite: {fileID: -1196241393, guid: 069a00c4a21d8654bbe27600f3ba7103, type: 3} + keyTwoSprite: {fileID: 13857534, guid: 069a00c4a21d8654bbe27600f3ba7103, type: 3} + keyThreeSprite: {fileID: -151394201, guid: 069a00c4a21d8654bbe27600f3ba7103, type: 3} + rootAnchoredPosition: {x: 0, y: 96} + iconSize: {x: 120, y: 120} + keySize: {x: 42, y: 56} + slotSpacing: 150 + keyOffset: {x: 0, y: -12} + titleOffset: {x: 0, y: 150} + titleFontSize: 36 + availableColor: {r: 1, g: 1, b: 1, a: 1} + usedColor: {r: 1, g: 1, b: 1, a: 0.28} + selectedOutlineColor: {r: 1, g: 0.3, b: 0.3, a: 1} + idleOutlineColor: {r: 0, g: 0, b: 0, a: 0} + outlineDistance: {x: 6, y: 6} --- !u!1 &123334091 GameObject: m_ObjectHideFlags: 0 @@ -652,7 +683,6 @@ MonoBehaviour: proximityMinDistance: 5 proximityMaxDistance: 30 voiceOutputMixerGroup: {fileID: 24300002, guid: d9084dee7259d2b43a99e89cd85b22c0, type: 2} - voiceSourceVolume: 1.7 --- !u!4 &148525648 Transform: m_ObjectHideFlags: 0 diff --git a/GGJ26/Assets/01. Scripts/UI/UISpectatorSabotageHud.cs.meta b/GGJ26/Assets/01. Scripts/UI/UISpectatorSabotageHud.cs.meta new file mode 100644 index 00000000..9546a8c3 --- /dev/null +++ b/GGJ26/Assets/01. Scripts/UI/UISpectatorSabotageHud.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c9b5e9a87a424d749c1d7f9f8e6a1b21 \ No newline at end of file diff --git a/GGJ26/Assets/03. Prefabs/Effects/SabotageShoeProjectile.prefab b/GGJ26/Assets/03. Prefabs/Effects/SabotageShoeProjectile.prefab deleted file mode 100644 index 507cfc71..00000000 --- a/GGJ26/Assets/03. Prefabs/Effects/SabotageShoeProjectile.prefab +++ /dev/null @@ -1,110 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1077857044643151974 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7190074053281291023} - - component: {fileID: 1895605195337015678} - - component: {fileID: 2281357707983634342} - - component: {fileID: 7170070887517061412} - m_Layer: 0 - m_Name: SabotageShoeProjectile - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7190074053281291023 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1077857044643151974} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: -1000, z: 5} - m_LocalScale: {x: 0.15, y: 0.08, z: 0.28} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &1895605195337015678 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1077857044643151974} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!65 &2281357707983634342 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1077857044643151974} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &7170070887517061412 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1077857044643151974} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, 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: 1 - 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} diff --git a/GGJ26/Assets/03. Prefabs/Effects/Shoe.prefab b/GGJ26/Assets/03. Prefabs/Effects/Shoe.prefab new file mode 100644 index 00000000..1baaadec --- /dev/null +++ b/GGJ26/Assets/03. Prefabs/Effects/Shoe.prefab @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &2573776019069807029 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + propertyPath: m_Name + value: Shoe + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: + - {fileID: 3087659954519394789, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + insertIndex: -1 + addedObject: {fileID: 3154598984297716879} + m_SourcePrefab: {fileID: 100100000, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} +--- !u!1 &3420073209668441316 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: ec91dfe8cc9a5b245be1175dd50044d7, type: 3} + m_PrefabInstance: {fileID: 2573776019069807029} + m_PrefabAsset: {fileID: 0} +--- !u!65 &3154598984297716879 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3420073209668441316} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} diff --git a/GGJ26/Assets/03. Prefabs/Effects/SabotageShoeProjectile.prefab.meta b/GGJ26/Assets/03. Prefabs/Effects/Shoe.prefab.meta similarity index 74% rename from GGJ26/Assets/03. Prefabs/Effects/SabotageShoeProjectile.prefab.meta rename to GGJ26/Assets/03. Prefabs/Effects/Shoe.prefab.meta index edcfae0c..f6268e84 100644 --- a/GGJ26/Assets/03. Prefabs/Effects/SabotageShoeProjectile.prefab.meta +++ b/GGJ26/Assets/03. Prefabs/Effects/Shoe.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d2b11640890aae846aa0fee9fe7029f3 +guid: f46a9b857611d234191ff125b1478341 PrefabImporter: externalObjects: {} userData: diff --git a/GGJ26/Assets/03. Prefabs/Player/PlayerArmature.prefab b/GGJ26/Assets/03. Prefabs/Player/PlayerArmature.prefab index 9809c7bf..b2207b20 100644 --- a/GGJ26/Assets/03. Prefabs/Player/PlayerArmature.prefab +++ b/GGJ26/Assets/03. Prefabs/Player/PlayerArmature.prefab @@ -1565,14 +1565,16 @@ MonoBehaviour: m_Bits: 4294967295 aimDistance: 60 smokeSpawnForwardOffset: 5 - shoeProjectilePrefab: {fileID: 1077857044643151974, guid: d2b11640890aae846aa0fee9fe7029f3, type: 3} + shoeProjectilePrefab: {fileID: 244245187828165283, guid: 8a232ea16e7727b44ba6a19d6c8399f0, type: 3} shoeStunSeconds: 0.5 shoeKnockbackSpeed: 2.4 - shoeProjectileSpeed: 18 + shoeProjectileSpeed: 24 shoeProjectileLifetime: 1.2 + shoeProjectileGravity: 4.2 shoeSpawnForwardOffset: 0.8 shoeHitRadius: 0.45 shoeHitDistance: 22 + shoeSpinDegreesPerSecond: {x: 1080, y: 540, z: 720} ghostSmokePrefab: {fileID: 5989128303339467817, guid: 8262abb744c274246a87fdf578f77f46, type: 3} ghostSmokeTemplateObjectName: SabotageGhostSmokeTemplate ghostSmokeLifetime: 10 diff --git a/GGJ26/Assets/03. Prefabs/Player/PlayerArmature_Normal.prefab b/GGJ26/Assets/03. Prefabs/Player/PlayerArmature_Normal.prefab index 8960dd0e..7ce9c332 100644 --- a/GGJ26/Assets/03. Prefabs/Player/PlayerArmature_Normal.prefab +++ b/GGJ26/Assets/03. Prefabs/Player/PlayerArmature_Normal.prefab @@ -677,14 +677,16 @@ MonoBehaviour: m_Bits: 4294967295 aimDistance: 60 smokeSpawnForwardOffset: 5 - shoeProjectilePrefab: {fileID: 1077857044643151974, guid: d2b11640890aae846aa0fee9fe7029f3, type: 3} + shoeProjectilePrefab: {fileID: 244245187828165283, guid: 8a232ea16e7727b44ba6a19d6c8399f0, type: 3} shoeStunSeconds: 0.5 shoeKnockbackSpeed: 2.4 - shoeProjectileSpeed: 18 + shoeProjectileSpeed: 24 shoeProjectileLifetime: 1.2 + shoeProjectileGravity: 4.2 shoeSpawnForwardOffset: 0.8 shoeHitRadius: 0.45 shoeHitDistance: 22 + shoeSpinDegreesPerSecond: {x: 1080, y: 540, z: 720} ghostSmokePrefab: {fileID: 5989128303339467817, guid: 8262abb744c274246a87fdf578f77f46, type: 3} ghostSmokeTemplateObjectName: SabotageGhostSmokeTemplate ghostSmokeLifetime: 10 diff --git a/GGJ26/Assets/03. Prefabs/Player/PlayerArmature_Seeker.prefab b/GGJ26/Assets/03. Prefabs/Player/PlayerArmature_Seeker.prefab index cc6fef8c..4f912c01 100644 --- a/GGJ26/Assets/03. Prefabs/Player/PlayerArmature_Seeker.prefab +++ b/GGJ26/Assets/03. Prefabs/Player/PlayerArmature_Seeker.prefab @@ -1564,14 +1564,16 @@ MonoBehaviour: m_Bits: 4294967295 aimDistance: 60 smokeSpawnForwardOffset: 5 - shoeProjectilePrefab: {fileID: 1077857044643151974, guid: d2b11640890aae846aa0fee9fe7029f3, type: 3} + shoeProjectilePrefab: {fileID: 244245187828165283, guid: 8a232ea16e7727b44ba6a19d6c8399f0, type: 3} shoeStunSeconds: 0.5 shoeKnockbackSpeed: 2.4 - shoeProjectileSpeed: 18 + shoeProjectileSpeed: 24 shoeProjectileLifetime: 1.2 + shoeProjectileGravity: 4.2 shoeSpawnForwardOffset: 0.8 shoeHitRadius: 0.45 shoeHitDistance: 22 + shoeSpinDegreesPerSecond: {x: 1080, y: 540, z: 720} ghostSmokePrefab: {fileID: 5989128303339467817, guid: 8262abb744c274246a87fdf578f77f46, type: 3} ghostSmokeTemplateObjectName: SabotageGhostSmokeTemplate ghostSmokeLifetime: 10 diff --git a/GGJ26/Assets/StarterAssets/ThirdPersonController/Prefabs/PlayerArmature_Normal.prefab b/GGJ26/Assets/StarterAssets/ThirdPersonController/Prefabs/PlayerArmature_Normal.prefab index 6f372bcb..2c8814aa 100644 --- a/GGJ26/Assets/StarterAssets/ThirdPersonController/Prefabs/PlayerArmature_Normal.prefab +++ b/GGJ26/Assets/StarterAssets/ThirdPersonController/Prefabs/PlayerArmature_Normal.prefab @@ -856,7 +856,8 @@ MonoBehaviour: m_Bits: 4294967295 aimDistance: 60 smokeSpawnForwardOffset: 5 - shoeProjectilePrefab: {fileID: 1077857044643151974, guid: d2b11640890aae846aa0fee9fe7029f3, type: 3} + shoeProjectilePrefab: {fileID: 3420073209668441316, guid: f46a9b857611d234191ff125b1478341, type: 3} + shoeTemplateObjectName: Shoe shoeStunSeconds: 0.5 shoeKnockbackSpeed: 2.4 shoeProjectileSpeed: 18 diff --git a/GGJ26/Assets/StarterAssets/TutorialInfo.meta b/GGJ26/Assets/StarterAssets/ThirdPersonController/TutorialInfo.meta similarity index 100% rename from GGJ26/Assets/StarterAssets/TutorialInfo.meta rename to GGJ26/Assets/StarterAssets/ThirdPersonController/TutorialInfo.meta diff --git a/GGJ26/Assets/StarterAssets/TutorialInfo/Icons.meta b/GGJ26/Assets/StarterAssets/ThirdPersonController/TutorialInfo/Icons.meta similarity index 100% rename from GGJ26/Assets/StarterAssets/TutorialInfo/Icons.meta rename to GGJ26/Assets/StarterAssets/ThirdPersonController/TutorialInfo/Icons.meta diff --git a/GGJ26/Assets/StarterAssets/TutorialInfo/Icons/ReadMeImg.PNG b/GGJ26/Assets/StarterAssets/ThirdPersonController/TutorialInfo/Icons/ReadMeImg.PNG similarity index 100% rename from GGJ26/Assets/StarterAssets/TutorialInfo/Icons/ReadMeImg.PNG rename to GGJ26/Assets/StarterAssets/ThirdPersonController/TutorialInfo/Icons/ReadMeImg.PNG diff --git a/GGJ26/Assets/StarterAssets/TutorialInfo/Icons/ReadMeImg.PNG.meta b/GGJ26/Assets/StarterAssets/ThirdPersonController/TutorialInfo/Icons/ReadMeImg.PNG.meta similarity index 100% rename from GGJ26/Assets/StarterAssets/TutorialInfo/Icons/ReadMeImg.PNG.meta rename to GGJ26/Assets/StarterAssets/ThirdPersonController/TutorialInfo/Icons/ReadMeImg.PNG.meta