using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif // 코스 데이터가 발판 위에 따로 얹는 장애물 프리팹을 제어한다. public class CourseObstacle : MonoBehaviour { public enum ObstacleKind { Jump, Slide } public ObstacleKind obstacleKind = ObstacleKind.Jump; public Transform lowObstacle; public SlideObstaclePattern slidePattern; public Transform ceilingPlatform; private Platform.PlatformSkin reservedSkin = Platform.PlatformSkin.Airport; private Platform.PlatformPattern reservedPlatformPattern = Platform.PlatformPattern.LowMid; private SlideObstaclePattern.SlideLayout reservedSlideLayout = SlideObstaclePattern.SlideLayout.CenterPair; public void Configure( Platform.PlatformSkin platformSkin, Platform.PlatformPattern platformPattern, SlideObstaclePattern.SlideLayout slideLayout) { reservedSkin = platformSkin; reservedPlatformPattern = platformPattern; reservedSlideLayout = slideLayout; ApplyConfiguration(); } private void Awake() { CacheReferences(); } private void OnEnable() { ApplyConfiguration(); } private void CacheReferences() { if(lowObstacle == null) { Transform foundObstacle = transform.Find("Jump Obstacle"); if(foundObstacle != null) { lowObstacle = foundObstacle; } } if(slidePattern == null) { slidePattern = GetComponent(); } if(ceilingPlatform == null) { Transform foundCeiling = transform.Find("Ceiling Platform"); if(foundCeiling != null) { ceilingPlatform = foundCeiling; } } } private void ApplyConfiguration() { CacheReferences(); if(obstacleKind == ObstacleKind.Jump) { ApplyJumpPosition(); } else if(slidePattern != null) { slidePattern.ConfigureLayout(reservedSlideLayout); } ApplyVisualSkin(); } private void ApplyJumpPosition() { if(lowObstacle == null) { return; } Vector3 localPosition = lowObstacle.localPosition; localPosition.x = GetJumpObstacleX(reservedPlatformPattern); lowObstacle.localPosition = localPosition; } private float GetJumpObstacleX(Platform.PlatformPattern platformPattern) { switch(platformPattern) { case Platform.PlatformPattern.LowLeft: return -0.44f; case Platform.PlatformPattern.LowRight: return 0.44f; case Platform.PlatformPattern.LowMid: default: return 0f; } } private void ApplyVisualSkin() { #if UNITY_EDITOR if(obstacleKind == ObstacleKind.Jump) { ApplySprite(lowObstacle, LoadSpriteAtPath(GetLowObstacleSkinPath(reservedSkin))); return; } Sprite hangingSprite = LoadSpriteAtPath(GetHangingObstacleSkinPath(reservedSkin)); Sprite ceilingSprite = LoadSpriteAtPath(GetCeilingSkinPath(reservedSkin)); if(slidePattern != null && slidePattern.obstacles != null) { for(int i = 0; i < slidePattern.obstacles.Length; i++) { ApplySprite(slidePattern.obstacles[i], hangingSprite); } } ApplySprite(ceilingPlatform, ceilingSprite); #endif } #if UNITY_EDITOR private void ApplySprite(Transform target, Sprite sprite) { if(target == null || sprite == null) { return; } SpriteRenderer spriteRenderer = target.GetComponent(); if(spriteRenderer != null) { spriteRenderer.sprite = sprite; } } private Sprite LoadSpriteAtPath(string assetPath) { if(string.IsNullOrEmpty(assetPath)) { return null; } return AssetDatabase.LoadAssetAtPath(assetPath); } private string GetLowObstacleSkinPath(Platform.PlatformSkin platformSkin) { switch(platformSkin) { case Platform.PlatformSkin.Japan: return "Assets/Sprites/ObstacleSkins/Skin_Obstacle_StoneLantern.png"; case Platform.PlatformSkin.China: return "Assets/Sprites/ObstacleSkins/Skin_Obstacle_MarketCrate.png"; case Platform.PlatformSkin.USA: return "Assets/Sprites/ObstacleSkins/Skin_Obstacle_Cone.png"; case Platform.PlatformSkin.Airport: default: return "Assets/Sprites/ObstacleSkins/Skin_Obstacle_Suitcases.png"; } } private string GetHangingObstacleSkinPath(Platform.PlatformSkin platformSkin) { switch(platformSkin) { case Platform.PlatformSkin.Japan: return "Assets/Sprites/ObstacleSkins/Skin_Hanging_RoadSign.png"; case Platform.PlatformSkin.China: return "Assets/Sprites/ObstacleSkins/Skin_Hanging_RedLanterns.png"; case Platform.PlatformSkin.USA: return "Assets/Sprites/ObstacleSkins/Skin_Hanging_Banner.png"; case Platform.PlatformSkin.Airport: default: return "Assets/Sprites/ObstacleSkins/Skin_Hanging_AirportSign.png"; } } private string GetCeilingSkinPath(Platform.PlatformSkin platformSkin) { if(platformSkin == Platform.PlatformSkin.Airport) { return "Assets/Sprites/ObstacleSkins/Skin_Platform_AirportCeiling.png"; } switch(platformSkin) { case Platform.PlatformSkin.Japan: return "Assets/Sprites/ObstacleSkins/Skin_Platform_Japan.png"; case Platform.PlatformSkin.China: return "Assets/Sprites/ObstacleSkins/Skin_Platform_China.png"; case Platform.PlatformSkin.USA: return "Assets/Sprites/ObstacleSkins/Skin_Platform_USA.png"; case Platform.PlatformSkin.Airport: default: return "Assets/Sprites/ObstacleSkins/Skin_Platform_AirportFloorTile.png"; } } #endif }