Add travel map flow and update docs
This commit is contained in:
+189
-7
@@ -1,4 +1,7 @@
|
||||
using UnityEngine;
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
// 발판으로서 필요한 동작을 담은 스크립트
|
||||
public class Platform : MonoBehaviour {
|
||||
@@ -8,7 +11,8 @@ public class Platform : MonoBehaviour {
|
||||
LowLeft,
|
||||
LowMid,
|
||||
LowRight,
|
||||
Slide
|
||||
Slide,
|
||||
ForceHit
|
||||
}
|
||||
|
||||
public enum MileagePattern {
|
||||
@@ -19,6 +23,15 @@ public class Platform : MonoBehaviour {
|
||||
SlideLine
|
||||
}
|
||||
|
||||
public enum ItemPattern {
|
||||
None,
|
||||
HealthSushi,
|
||||
InvincibleRamen,
|
||||
Shield,
|
||||
SpeedShoes,
|
||||
MileageCard
|
||||
}
|
||||
|
||||
public GameObject[] obstacles; // 장애물 오브젝트들
|
||||
public int emptyPatternWeight = 2; // 장애물이 없는 패턴이 선택될 가중치
|
||||
public Sprite mileageSprite; // 이 발판에서 사용할 마일리지 토큰 스프라이트
|
||||
@@ -28,20 +41,34 @@ 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 const int MileagePoolSize = 5;
|
||||
private const int ItemPoolSize = 1;
|
||||
private const float MileageTokenScale = 0.55f;
|
||||
private const float MileageColliderRadius = 0.4f;
|
||||
private const float ItemTokenScale = 0.68f;
|
||||
private const float ItemColliderRadius = 0.46f;
|
||||
|
||||
public void ConfigureForTutorial(PlatformPattern pattern, MileagePattern mileagePattern) {
|
||||
public void ConfigureForTutorial(
|
||||
PlatformPattern pattern,
|
||||
MileagePattern mileagePattern,
|
||||
SlideObstaclePattern.SlideLayout slideLayout = SlideObstaclePattern.SlideLayout.Random,
|
||||
ItemPattern itemPattern = ItemPattern.None) {
|
||||
reservedPattern = pattern;
|
||||
reservedMileagePattern = mileagePattern;
|
||||
reservedSlideLayout = slideLayout;
|
||||
reservedItemPattern = itemPattern;
|
||||
}
|
||||
|
||||
public void ConfigureForRandom() {
|
||||
reservedPattern = PlatformPattern.Random;
|
||||
reservedMileagePattern = MileagePattern.Random;
|
||||
reservedSlideLayout = SlideObstaclePattern.SlideLayout.Random;
|
||||
reservedItemPattern = ItemPattern.None;
|
||||
}
|
||||
|
||||
// 컴포넌트가 활성화될때 마다 매번 실행되는 메서드
|
||||
@@ -50,6 +77,7 @@ public class Platform : MonoBehaviour {
|
||||
|
||||
stepped = false;
|
||||
EnsureMileagePickups();
|
||||
EnsureItemPickups();
|
||||
|
||||
for(int i = 0; i < obstacles.Length; i++)
|
||||
{
|
||||
@@ -57,10 +85,11 @@ public class Platform : MonoBehaviour {
|
||||
}
|
||||
|
||||
HideMileagePickups();
|
||||
HideItemPickups();
|
||||
|
||||
if(reservedPattern != PlatformPattern.Random)
|
||||
{
|
||||
ApplyTutorialPattern();
|
||||
ApplyReservedPattern();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -77,6 +106,7 @@ public class Platform : MonoBehaviour {
|
||||
if(patternIndex < obstacles.Length)
|
||||
{
|
||||
activeObstacle = obstacles[patternIndex];
|
||||
ConfigureSlideObstacle(activeObstacle);
|
||||
activeObstacle.SetActive(true);
|
||||
}
|
||||
|
||||
@@ -85,7 +115,7 @@ public class Platform : MonoBehaviour {
|
||||
|
||||
void OnCollisionEnter2D(Collision2D collision) {
|
||||
// 플레이어 캐릭터가 자신을 밟았을때 점수를 추가하는 처리
|
||||
if(collision.collider.tag == "Player" && !stepped)
|
||||
if(collision.collider.tag == "Player" && !stepped && GameFlowManager.IsGameplayActive)
|
||||
{
|
||||
stepped = true;
|
||||
GameManager.instance.AddScore(1);
|
||||
@@ -122,6 +152,33 @@ public class Platform : MonoBehaviour {
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureItemPickups() {
|
||||
if(itemPickups != null && itemPickups.Length == ItemPoolSize)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
itemPickups = new ItemPickup[ItemPoolSize];
|
||||
|
||||
for(int i = 0; i < ItemPoolSize; i++)
|
||||
{
|
||||
GameObject pickupObject = new GameObject("Tutorial Item Pickup " + (i + 1));
|
||||
pickupObject.transform.SetParent(transform);
|
||||
pickupObject.transform.localScale = GetParentScaleCompensatedVector(ItemTokenScale);
|
||||
|
||||
SpriteRenderer spriteRenderer = pickupObject.AddComponent<SpriteRenderer>();
|
||||
spriteRenderer.sortingLayerName = "Foreground";
|
||||
spriteRenderer.sortingOrder = 2;
|
||||
|
||||
CircleCollider2D pickupCollider = pickupObject.AddComponent<CircleCollider2D>();
|
||||
pickupCollider.isTrigger = true;
|
||||
pickupCollider.radius = ItemColliderRadius;
|
||||
|
||||
itemPickups[i] = pickupObject.AddComponent<ItemPickup>();
|
||||
pickupObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
private void HideMileagePickups() {
|
||||
if(mileagePickups == null)
|
||||
{
|
||||
@@ -137,6 +194,21 @@ public class Platform : MonoBehaviour {
|
||||
}
|
||||
}
|
||||
|
||||
private void HideItemPickups() {
|
||||
if(itemPickups == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for(int i = 0; i < itemPickups.Length; i++)
|
||||
{
|
||||
if(itemPickups[i] != null)
|
||||
{
|
||||
itemPickups[i].gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void TryPlaceMileagePattern(GameObject activeObstacle) {
|
||||
if(mileageSprite == null || mileagePickups == null || Random.Range(0, 100) >= mileagePatternChance)
|
||||
{
|
||||
@@ -159,7 +231,7 @@ public class Platform : MonoBehaviour {
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyTutorialPattern() {
|
||||
private void ApplyReservedPattern() {
|
||||
GameObject activeObstacle = null;
|
||||
|
||||
switch(reservedPattern)
|
||||
@@ -176,14 +248,46 @@ public class Platform : MonoBehaviour {
|
||||
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(activeObstacle != null)
|
||||
if(reservedPattern != PlatformPattern.ForceHit && activeObstacle != null)
|
||||
{
|
||||
activeObstacle.SetActive(true);
|
||||
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) {
|
||||
@@ -226,6 +330,84 @@ public class Platform : MonoBehaviour {
|
||||
TryPlaceMileagePattern(activeObstacle);
|
||||
}
|
||||
|
||||
private void PlaceReservedItemPattern() {
|
||||
if(reservedItemPattern == ItemPattern.None || itemPickups == null || itemPickups.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
GameManager.TutorialItemType itemType = GetTutorialItemType(reservedItemPattern);
|
||||
ItemPickup pickup = itemPickups[0];
|
||||
pickup.Setup(LoadItemSprite(itemType), itemType);
|
||||
pickup.transform.localPosition = GetParentScaleCompensatedPosition(GetItemPosition(reservedItemPattern));
|
||||
pickup.ResetPickup();
|
||||
}
|
||||
|
||||
private GameManager.TutorialItemType GetTutorialItemType(ItemPattern itemPattern) {
|
||||
switch(itemPattern)
|
||||
{
|
||||
case ItemPattern.InvincibleRamen:
|
||||
return GameManager.TutorialItemType.InvincibleRamen;
|
||||
case ItemPattern.Shield:
|
||||
return GameManager.TutorialItemType.Shield;
|
||||
case ItemPattern.SpeedShoes:
|
||||
return GameManager.TutorialItemType.SpeedShoes;
|
||||
case ItemPattern.MileageCard:
|
||||
return GameManager.TutorialItemType.MileageCard;
|
||||
case ItemPattern.HealthSushi:
|
||||
default:
|
||||
return GameManager.TutorialItemType.HealthSushi;
|
||||
}
|
||||
}
|
||||
|
||||
private Vector2 GetItemPosition(ItemPattern itemPattern) {
|
||||
switch(itemPattern)
|
||||
{
|
||||
case ItemPattern.HealthSushi:
|
||||
return new Vector2(-1.6f, 1.55f);
|
||||
case ItemPattern.InvincibleRamen:
|
||||
return new Vector2(-0.8f, 1.55f);
|
||||
case ItemPattern.Shield:
|
||||
return new Vector2(-0.2f, 1.55f);
|
||||
case ItemPattern.SpeedShoes:
|
||||
return new Vector2(0.7f, 1.55f);
|
||||
case ItemPattern.MileageCard:
|
||||
return new Vector2(1.4f, 1.55f);
|
||||
default:
|
||||
return new Vector2(0f, 1.55f);
|
||||
}
|
||||
}
|
||||
|
||||
private Sprite LoadItemSprite(GameManager.TutorialItemType itemType) {
|
||||
#if UNITY_EDITOR
|
||||
string assetPath = "";
|
||||
|
||||
switch(itemType)
|
||||
{
|
||||
case GameManager.TutorialItemType.InvincibleRamen:
|
||||
assetPath = "Assets/Sprites/Items/Item_Invincible_Ramen.png";
|
||||
break;
|
||||
case GameManager.TutorialItemType.Shield:
|
||||
assetPath = "Assets/Sprites/Items/Item_Shield.png";
|
||||
break;
|
||||
case GameManager.TutorialItemType.SpeedShoes:
|
||||
assetPath = "Assets/Sprites/Items/Item_Speed_Shoes.png";
|
||||
break;
|
||||
case GameManager.TutorialItemType.MileageCard:
|
||||
assetPath = "Assets/Sprites/Items/Item_Mileage_Card.png";
|
||||
break;
|
||||
case GameManager.TutorialItemType.HealthSushi:
|
||||
default:
|
||||
assetPath = "Assets/Sprites/Items/Item_Health_Sushi.png";
|
||||
break;
|
||||
}
|
||||
|
||||
return AssetDatabase.LoadAssetAtPath<Sprite>(assetPath);
|
||||
#else
|
||||
return null;
|
||||
#endif
|
||||
}
|
||||
|
||||
private void PlaceSafeMileageLine() {
|
||||
Vector2[] positions = {
|
||||
new Vector2(-2f, 1.35f),
|
||||
|
||||
Reference in New Issue
Block a user