Refactor course maps and travel UI
This commit is contained in:
+8
-260
@@ -39,8 +39,6 @@ public class Platform : MonoBehaviour {
|
||||
USA
|
||||
}
|
||||
|
||||
public GameObject[] obstacles; // 장애물 오브젝트들
|
||||
public int emptyPatternWeight = 2; // 장애물이 없는 패턴이 선택될 가중치
|
||||
public Sprite mileageSprite; // 이 발판에서 사용할 마일리지 토큰 스프라이트
|
||||
public int mileagePatternChance = 50; // 마일리지 패턴 등장 확률
|
||||
public int smallMileageValue = 10; // 일반 토큰 가치
|
||||
@@ -49,9 +47,7 @@ public class Platform : MonoBehaviour {
|
||||
private bool stepped = false; // 플레이어 캐릭터가 밟았었는가
|
||||
private MileagePickup[] mileagePickups; // 런타임에 생성하는 마일리지 토큰 풀
|
||||
private ItemPickup[] itemPickups; // 런타임에 생성하는 튜토리얼 아이템 풀
|
||||
private PlatformPattern reservedPattern = PlatformPattern.Random; // 다음 활성화 때 사용할 수동 패턴
|
||||
private MileagePattern reservedMileagePattern = MileagePattern.Random; // 다음 활성화 때 사용할 마일리지 패턴
|
||||
private SlideObstaclePattern.SlideLayout reservedSlideLayout = SlideObstaclePattern.SlideLayout.Random; // 다음 슬라이딩 장애물 배치
|
||||
private ItemPattern reservedItemPattern = ItemPattern.None; // 다음 활성화 때 사용할 아이템 배치
|
||||
private PlatformSkin reservedSkin = PlatformSkin.Airport; // 현재 맵에서 사용할 발판/장애물 스킨
|
||||
private const int MileagePoolSize = 5;
|
||||
@@ -63,23 +59,14 @@ public class Platform : MonoBehaviour {
|
||||
private const float JumpMileageMinWidthScale = 1.8f;
|
||||
private const float JumpMileageMaxWidthScale = 2.5f;
|
||||
|
||||
public void ConfigureForTutorial(
|
||||
PlatformPattern pattern,
|
||||
MileagePattern mileagePattern,
|
||||
SlideObstaclePattern.SlideLayout slideLayout = SlideObstaclePattern.SlideLayout.Random,
|
||||
ItemPattern itemPattern = ItemPattern.None,
|
||||
PlatformSkin platformSkin = PlatformSkin.Airport) {
|
||||
reservedPattern = pattern;
|
||||
public void ConfigureForTutorial(MileagePattern mileagePattern, ItemPattern itemPattern = ItemPattern.None, PlatformSkin platformSkin = PlatformSkin.Airport) {
|
||||
reservedMileagePattern = mileagePattern;
|
||||
reservedSlideLayout = slideLayout;
|
||||
reservedItemPattern = itemPattern;
|
||||
reservedSkin = platformSkin;
|
||||
}
|
||||
|
||||
public void ConfigureForRandom(PlatformSkin platformSkin = PlatformSkin.Airport) {
|
||||
reservedPattern = PlatformPattern.Random;
|
||||
reservedMileagePattern = MileagePattern.Random;
|
||||
reservedSlideLayout = SlideObstaclePattern.SlideLayout.Random;
|
||||
reservedItemPattern = ItemPattern.None;
|
||||
reservedSkin = platformSkin;
|
||||
}
|
||||
@@ -93,38 +80,10 @@ public class Platform : MonoBehaviour {
|
||||
EnsureMileagePickups();
|
||||
EnsureItemPickups();
|
||||
|
||||
for(int i = 0; i < obstacles.Length; i++)
|
||||
{
|
||||
obstacles[i].SetActive(false);
|
||||
}
|
||||
|
||||
HideMileagePickups();
|
||||
HideItemPickups();
|
||||
|
||||
if(reservedPattern != PlatformPattern.Random)
|
||||
{
|
||||
ApplyReservedPattern();
|
||||
return;
|
||||
}
|
||||
|
||||
if(obstacles.Length == 0)
|
||||
{
|
||||
TryPlaceMileagePattern(null);
|
||||
return;
|
||||
}
|
||||
|
||||
// 낮은 장애물과 높은 장애물이 동시에 켜져 불가능한 배치가 되지 않도록 하나만 선택한다.
|
||||
int patternIndex = Random.Range(0, obstacles.Length + emptyPatternWeight);
|
||||
GameObject activeObstacle = null;
|
||||
|
||||
if(patternIndex < obstacles.Length)
|
||||
{
|
||||
activeObstacle = obstacles[patternIndex];
|
||||
ConfigureSlideObstacle(activeObstacle);
|
||||
activeObstacle.SetActive(true);
|
||||
}
|
||||
|
||||
TryPlaceMileagePattern(activeObstacle);
|
||||
PlaceReservedMileagePattern();
|
||||
PlaceReservedItemPattern();
|
||||
}
|
||||
|
||||
void OnCollisionEnter2D(Collision2D collision) {
|
||||
@@ -223,100 +182,16 @@ public class Platform : MonoBehaviour {
|
||||
}
|
||||
}
|
||||
|
||||
private void TryPlaceMileagePattern(GameObject activeObstacle) {
|
||||
private void TryPlaceMileagePattern() {
|
||||
if(mileageSprite == null || mileagePickups == null || Random.Range(0, 100) >= mileagePatternChance)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(activeObstacle == null)
|
||||
{
|
||||
PlaceSafeMileageLine();
|
||||
return;
|
||||
}
|
||||
|
||||
if(activeObstacle.name.Contains("Slide"))
|
||||
{
|
||||
PlaceSlideMileageLine();
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaceJumpMileageArc(GetWorldRelativeX(activeObstacle.transform));
|
||||
}
|
||||
PlaceSafeMileageLine();
|
||||
}
|
||||
|
||||
private void ApplyReservedPattern() {
|
||||
GameObject activeObstacle = null;
|
||||
|
||||
switch(reservedPattern)
|
||||
{
|
||||
case PlatformPattern.LowLeft:
|
||||
activeObstacle = FindObstacle("Obstacle Left");
|
||||
break;
|
||||
case PlatformPattern.LowMid:
|
||||
activeObstacle = FindObstacle("Obstacle Mid");
|
||||
break;
|
||||
case PlatformPattern.LowRight:
|
||||
activeObstacle = FindObstacle("Obstacle Right");
|
||||
break;
|
||||
case PlatformPattern.Slide:
|
||||
activeObstacle = FindObstacle("Slide Obstacle Pattern");
|
||||
break;
|
||||
case PlatformPattern.ForceHit:
|
||||
activeObstacle = FindObstacle("Obstacle Mid");
|
||||
ActivateObstacle(activeObstacle);
|
||||
|
||||
GameObject slideObstacle = FindObstacle("Slide Obstacle Pattern");
|
||||
reservedSlideLayout = SlideObstaclePattern.SlideLayout.WidePair;
|
||||
ActivateObstacle(slideObstacle);
|
||||
break;
|
||||
}
|
||||
|
||||
if(reservedPattern != PlatformPattern.ForceHit && activeObstacle != null)
|
||||
{
|
||||
ActivateObstacle(activeObstacle);
|
||||
}
|
||||
|
||||
PlaceReservedMileagePattern(activeObstacle);
|
||||
PlaceReservedItemPattern();
|
||||
}
|
||||
|
||||
private void ActivateObstacle(GameObject obstacle) {
|
||||
if(obstacle == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ConfigureSlideObstacle(obstacle);
|
||||
obstacle.SetActive(true);
|
||||
}
|
||||
|
||||
private void ConfigureSlideObstacle(GameObject activeObstacle) {
|
||||
if(activeObstacle == null || !activeObstacle.name.Contains("Slide"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SlideObstaclePattern slideObstaclePattern = activeObstacle.GetComponent<SlideObstaclePattern>();
|
||||
if(slideObstaclePattern != null)
|
||||
{
|
||||
slideObstaclePattern.ConfigureLayout(reservedSlideLayout);
|
||||
}
|
||||
}
|
||||
|
||||
private GameObject FindObstacle(string obstacleName) {
|
||||
for(int i = 0; i < obstacles.Length; i++)
|
||||
{
|
||||
if(obstacles[i] != null && obstacles[i].name == obstacleName)
|
||||
{
|
||||
return obstacles[i];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void PlaceReservedMileagePattern(GameObject activeObstacle) {
|
||||
private void PlaceReservedMileagePattern() {
|
||||
if(mileageSprite == null || mileagePickups == null || reservedMileagePattern == MileagePattern.None)
|
||||
{
|
||||
return;
|
||||
@@ -330,8 +205,7 @@ public class Platform : MonoBehaviour {
|
||||
|
||||
if(reservedMileagePattern == MileagePattern.JumpArc)
|
||||
{
|
||||
float obstacleX = activeObstacle != null ? GetWorldRelativeX(activeObstacle.transform) : 0f;
|
||||
PlaceJumpMileageArc(obstacleX);
|
||||
PlaceJumpMileageArc(0f);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -341,7 +215,7 @@ public class Platform : MonoBehaviour {
|
||||
return;
|
||||
}
|
||||
|
||||
TryPlaceMileagePattern(activeObstacle);
|
||||
TryPlaceMileagePattern();
|
||||
}
|
||||
|
||||
private void PlaceReservedItemPattern() {
|
||||
@@ -397,22 +271,10 @@ public class Platform : MonoBehaviour {
|
||||
private void ApplyVisualSkin() {
|
||||
#if UNITY_EDITOR
|
||||
Sprite platformSprite = LoadSpriteAtPath(GetPlatformSkinPath(reservedSkin));
|
||||
Sprite ceilingSprite = LoadSpriteAtPath(GetCeilingSkinPath(reservedSkin));
|
||||
Sprite lowObstacleSprite = LoadSpriteAtPath(GetLowObstacleSkinPath(reservedSkin));
|
||||
Sprite hangingObstacleSprite = LoadSpriteAtPath(GetHangingObstacleSkinPath(reservedSkin));
|
||||
Sprite mileageSkinSprite = LoadSpriteAtPath(GetMileageSkinPath(reservedSkin));
|
||||
|
||||
ApplySprite(GetComponent<SpriteRenderer>(), platformSprite);
|
||||
|
||||
Transform ceilingPlatform = FindChildRecursive(transform, "Ceiling Platform");
|
||||
if(ceilingPlatform != null)
|
||||
{
|
||||
ApplySprite(ceilingPlatform.GetComponent<SpriteRenderer>(), ceilingSprite != null ? ceilingSprite : platformSprite);
|
||||
}
|
||||
|
||||
ApplyLowObstacleSkin(lowObstacleSprite);
|
||||
ApplyHangingObstacleSkin(hangingObstacleSprite);
|
||||
|
||||
if(mileageSkinSprite != null)
|
||||
{
|
||||
mileageSprite = mileageSkinSprite;
|
||||
@@ -421,52 +283,6 @@ public class Platform : MonoBehaviour {
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
private void ApplyLowObstacleSkin(Sprite obstacleSprite) {
|
||||
if(obstacleSprite == null || obstacles == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for(int i = 0; i < obstacles.Length; i++)
|
||||
{
|
||||
GameObject obstacle = obstacles[i];
|
||||
if(obstacle == null || obstacle.name.Contains("Slide"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ApplySprite(obstacle.GetComponent<SpriteRenderer>(), obstacleSprite);
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyHangingObstacleSkin(Sprite obstacleSprite) {
|
||||
if(obstacleSprite == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
GameObject slideObstacle = FindObstacle("Slide Obstacle Pattern");
|
||||
if(slideObstacle == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SlideObstaclePattern slideObstaclePattern = slideObstacle.GetComponent<SlideObstaclePattern>();
|
||||
if(slideObstaclePattern == null || slideObstaclePattern.obstacles == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for(int i = 0; i < slideObstaclePattern.obstacles.Length; i++)
|
||||
{
|
||||
Transform hangingObstacle = slideObstaclePattern.obstacles[i];
|
||||
if(hangingObstacle != null)
|
||||
{
|
||||
ApplySprite(hangingObstacle.GetComponent<SpriteRenderer>(), obstacleSprite);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplySprite(SpriteRenderer spriteRenderer, Sprite sprite) {
|
||||
if(spriteRenderer != null && sprite != null)
|
||||
{
|
||||
@@ -483,31 +299,6 @@ public class Platform : MonoBehaviour {
|
||||
return AssetDatabase.LoadAssetAtPath<Sprite>(assetPath);
|
||||
}
|
||||
|
||||
private Transform FindChildRecursive(Transform parent, string childName) {
|
||||
if(parent == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
for(int i = 0; i < parent.childCount; i++)
|
||||
{
|
||||
Transform child = parent.GetChild(i);
|
||||
|
||||
if(child.name == childName)
|
||||
{
|
||||
return child;
|
||||
}
|
||||
|
||||
Transform match = FindChildRecursive(child, childName);
|
||||
if(match != null)
|
||||
{
|
||||
return match;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private string GetPlatformSkinPath(PlatformSkin platformSkin) {
|
||||
switch(platformSkin)
|
||||
{
|
||||
@@ -523,45 +314,6 @@ public class Platform : MonoBehaviour {
|
||||
}
|
||||
}
|
||||
|
||||
private string GetCeilingSkinPath(PlatformSkin platformSkin) {
|
||||
if(platformSkin == PlatformSkin.Airport)
|
||||
{
|
||||
return "Assets/Sprites/ObstacleSkins/Skin_Platform_AirportCeiling.png";
|
||||
}
|
||||
|
||||
return GetPlatformSkinPath(platformSkin);
|
||||
}
|
||||
|
||||
private string GetLowObstacleSkinPath(PlatformSkin platformSkin) {
|
||||
switch(platformSkin)
|
||||
{
|
||||
case PlatformSkin.Japan:
|
||||
return "Assets/Sprites/ObstacleSkins/Skin_Obstacle_StoneLantern.png";
|
||||
case PlatformSkin.China:
|
||||
return "Assets/Sprites/ObstacleSkins/Skin_Obstacle_MarketCrate.png";
|
||||
case PlatformSkin.USA:
|
||||
return "Assets/Sprites/ObstacleSkins/Skin_Obstacle_Cone.png";
|
||||
case PlatformSkin.Airport:
|
||||
default:
|
||||
return "Assets/Sprites/ObstacleSkins/Skin_Obstacle_Suitcases.png";
|
||||
}
|
||||
}
|
||||
|
||||
private string GetHangingObstacleSkinPath(PlatformSkin platformSkin) {
|
||||
switch(platformSkin)
|
||||
{
|
||||
case PlatformSkin.Japan:
|
||||
return "Assets/Sprites/ObstacleSkins/Skin_Hanging_RoadSign.png";
|
||||
case PlatformSkin.China:
|
||||
return "Assets/Sprites/ObstacleSkins/Skin_Hanging_RedLanterns.png";
|
||||
case PlatformSkin.USA:
|
||||
return "Assets/Sprites/ObstacleSkins/Skin_Hanging_Banner.png";
|
||||
case PlatformSkin.Airport:
|
||||
default:
|
||||
return "Assets/Sprites/ObstacleSkins/Skin_Hanging_AirportSign.png";
|
||||
}
|
||||
}
|
||||
|
||||
private string GetMileageSkinPath(PlatformSkin platformSkin) {
|
||||
switch(platformSkin)
|
||||
{
|
||||
@@ -681,10 +433,6 @@ public class Platform : MonoBehaviour {
|
||||
return new Vector3(position.x / parentScaleX, position.y / parentScaleY, 0f);
|
||||
}
|
||||
|
||||
private float GetWorldRelativeX(Transform child) {
|
||||
return child.localPosition.x * transform.localScale.x;
|
||||
}
|
||||
|
||||
private void SetPickupValue(int index, int value) {
|
||||
if(index < 0 || index >= mileagePickups.Length || !mileagePickups[index].gameObject.activeSelf)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user