From ec35defeb7f85e658241ced9f039a41275991c31 Mon Sep 17 00:00:00 2001 From: hzmt Date: Sat, 31 Jan 2026 21:09:59 -0600 Subject: [PATCH] Trick tweaks --- Assets/Prefabs/Player.prefab | 2 +- Assets/Prefabs/Trick.prefab | 1 + Assets/Scripts/TrickController.cs | 49 +++++++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab index 45afadb..7bf77b5 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Player.prefab @@ -233,7 +233,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3937090937419967315} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b88e05c37f07ccf48bcc436a9d7def5d, type: 3} m_Name: diff --git a/Assets/Prefabs/Trick.prefab b/Assets/Prefabs/Trick.prefab index 55e21df..ad14675 100644 --- a/Assets/Prefabs/Trick.prefab +++ b/Assets/Prefabs/Trick.prefab @@ -192,6 +192,7 @@ MonoBehaviour: avoidPlayerWeight: 0.25 avoidTrickWeight: 0.2 wanderWeight: 0.4 + maxTricks: 50 jumpImpulse: 6 jumpCooldown: 1 jumpChancePerSecond: 0.5 diff --git a/Assets/Scripts/TrickController.cs b/Assets/Scripts/TrickController.cs index 5b8e11c..f8a448f 100644 --- a/Assets/Scripts/TrickController.cs +++ b/Assets/Scripts/TrickController.cs @@ -1,10 +1,17 @@ +using System; using System.Collections.Generic; using UnityEngine; +using Random = UnityEngine.Random; + [RequireComponent(typeof(Rigidbody2D))] [RequireComponent(typeof(Collider2D))] public class TrickController : MonoBehaviour { + private static readonly List ActiveTricks = new List(); + private static PlayerPlatformerController[] cachedPlayers = Array.Empty(); + private static float nextPlayerCacheTime; + [SerializeField] private string treatTag = "Interactable"; [SerializeField] private float moveSpeed = 3.5f; [SerializeField] private float targetRefreshInterval = 0.4f; @@ -18,6 +25,7 @@ public class TrickController : MonoBehaviour [SerializeField] private float avoidPlayerWeight = 0.25f; [SerializeField] private float avoidTrickWeight = 0.2f; [SerializeField] private float wanderWeight = 0.4f; + [SerializeField] private int maxTricks = 50; [SerializeField] private float jumpImpulse = 6f; [SerializeField] private float jumpCooldown = 1f; [SerializeField] private float jumpChancePerSecond = 0.5f; @@ -44,6 +52,19 @@ public class TrickController : MonoBehaviour body.interpolation = RigidbodyInterpolation2D.Interpolate; } + private void OnEnable() + { + if (!ActiveTricks.Contains(this)) + { + ActiveTricks.Add(this); + } + } + + private void OnDisable() + { + ActiveTricks.Remove(this); + } + private void Update() { @@ -88,6 +109,14 @@ public class TrickController : MonoBehaviour return; } + if (!IsGrounded()) + { + var airborne = body.linearVelocity; + airborne.x = 0f; + body.linearVelocity = airborne; + return; + } + Vector2 desiredVelocity; var stopForTreat = false; var avoidPlayerDirection = GetAvoidPlayerDirection(); @@ -203,6 +232,11 @@ public class TrickController : MonoBehaviour private void SpawnTrick(Vector3 position) { + if (maxTricks > 0 && ActiveTricks.Count >= maxTricks) + { + return; + } + if (trickPrefab != null) { Instantiate(trickPrefab, position, Quaternion.identity); @@ -214,7 +248,13 @@ public class TrickController : MonoBehaviour private float GetAvoidPlayerDirection() { - var players = FindObjectsByType(FindObjectsSortMode.None); + if (Time.time >= nextPlayerCacheTime) + { + cachedPlayers = FindObjectsByType(FindObjectsSortMode.None); + nextPlayerCacheTime = Time.time + 0.5f; + } + + var players = cachedPlayers; if (players == null || players.Length == 0) { return 0f; @@ -249,8 +289,7 @@ public class TrickController : MonoBehaviour private float GetAvoidTrickDirection() { - var tricks = FindObjectsByType(FindObjectsSortMode.None); - if (tricks == null || tricks.Length <= 1) + if (ActiveTricks.Count <= 1) { return 0f; } @@ -258,9 +297,9 @@ public class TrickController : MonoBehaviour Transform closest = null; var closestDist = float.MaxValue; var origin = transform.position; - for (var i = 0; i < tricks.Length; i++) + for (var i = 0; i < ActiveTricks.Count; i++) { - var candidate = tricks[i]; + var candidate = ActiveTricks[i]; if (candidate == null || candidate == this || !candidate.gameObject.activeInHierarchy) { continue;