ํŠธ๋ฆฌ๊ฑฐ ๊ด€๋ จํ•ด์„œ ํ•˜๋‚˜๋กœ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ๋งŒ๋“ค๊ณ  ์žˆ๋Š”์ค‘์ธ๋ฐ

ํŠธ๋ฆฌ๊ฑฐ ํ™œ์„ฑ ๋น„ํ™œ์„ฑ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์„ ์Šคํฌ๋Ÿฝํ„ฐ๋ธ”์˜ค๋ธŒ์ ํŠธ๋กœ ๋งŒ๋“ค์—ˆ์–ด

๊ฑฐ๊ธฐ์— ์ด์ œ ํ™œ์„ฑ ๋น„ํ™œ์„ฑํ•˜๋ ค๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ• ๋‹นํ•˜๋Š”๋ฐ ์ด๊ฒŒ ํ• ๋‹น์ด ์•ˆ๋˜๋„ค ๋ฌด์Šจ์ด์œ ์ผ๊นŒ

ํ•ด๋‹น๋ถ€๋ถ„ ์Šคํฌ๋ฆฝํŠธ


using System.Collections.Generic;

using UnityEngine;


[CreateAssetMenu(menuName = "ํŠธ๋ฆฌ๊ฑฐ ์•ก์…˜/์˜ค๋ธŒ์ ํŠธ ํ™œ์„ฑํ™”")]

public class ActivateObjectsAction : ITriggerAction

{

[Header("ํ™œ์„ฑํ™”ํ•  ์˜ค๋ธŒ์ ํŠธ๋“ค")]

[SerializeField]

private List<GameObject> objectsToActivate = new List<GameObject>(); --- ์ด ๋ถ€๋ถ„์ด ์ธ์ŠคํŽ™ํŠธ์—์„œ ํ• ๋‹น์ด ์•ˆ๋จ

// ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ™œ์„ฑํ™”ํ•  ์˜ค๋ธŒ์ ํŠธ ๋ฆฌ์ŠคํŠธ


/// <summary>

/// ํŠธ๋ฆฌ๊ฑฐ ์ง„์ž… ์‹œ ์‹คํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ.

/// ์ง€์ •๋œ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

/// </summary>

public override void ExecuteEnterAction()

{

SetActiveState(true);

}


/// <summary>

/// ํŠธ๋ฆฌ๊ฑฐ ์ข…๋ฃŒ ์‹œ ์‹คํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ.

/// ์ง€์ •๋œ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

/// </summary>

public override void ExecuteExitAction()

{

SetActiveState(false);

}


/// <summary>

/// ์ง€์ •๋œ ์˜ค๋ธŒ์ ํŠธ๋“ค์˜ ํ™œ์„ฑํ™” ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

/// </summary>

/// <param name="state">ํ™œ์„ฑํ™”ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฌ์–ธ ๊ฐ’</param>

private void SetActiveState(bool state)

{

// objectsToActivate ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ null์ธ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜

if (objectsToActivate == null || objectsToActivate.Count == 0) return;


// ๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ๊ฐ ์˜ค๋ธŒ์ ํŠธ์˜ ํ™œ์„ฑํ™” ์ƒํƒœ๋ฅผ ์„ค์ •

foreach (var obj in objectsToActivate)

{

if (obj != null)

{

obj.SetActive(state);

}

}

}

}


///// ํŠธ๋ฆฌ๊ฑฐ๋งค๋‹ˆ์ € ์Šคํฌ๋ฆฝํŠธ -- ๊ฐ์ข… ์•ก์…˜๊ด€๋ จ ํ•œ๋ฐฉ์— ๋ชจ๋“ˆ์‹œ์ผœ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๋ชฉ์  ๋‘๊ณ ๋‘๊ณ  ์จ๋จน์œผ๋ ค๊ณ 

using System.Collections.Generic;
using UnityEngine;

public class TriggerManager : MonoBehaviour
{
[System.Serializable]
public class TagObjectPair
{
[Header("๋น„๊ตํ•  ํƒœ๊ทธ๋“ค")]
public List<string> tags = new List<string>();

[Header("ํƒœ๊ทธ ์ผ์น˜ ์‹œ ์‹คํ–‰ํ•  ์˜ค๋ธŒ์ ํŠธ ํ™œ์„ฑํ™” ์•ก์…˜๋“ค")]
public List<ActivateObjectsAction> enterActivateActions = new List<ActivateObjectsAction>();
public List<ActivateObjectsAction> exitActivateActions = new List<ActivateObjectsAction>();

}

[Header("ํƒœ๊ทธ-์˜ค๋ธŒ์ ํŠธ ์„ค์ •")]
[SerializeField]
private List<TagObjectPair> tagObjectPairs = new List<TagObjectPair>();

public void HandleTriggerEnter(Collider other)
{
foreach (var pair in tagObjectPairs)
{
if (AreAllTagsMatching(other, pair.tags))
{
ExecuteActions(pair.enterActivateActions, true);
}
}
}

public void HandleTriggerExit(Collider other)
{
foreach (var pair in tagObjectPairs)
{
if (AreAllTagsMatching(other, pair.tags))
{
ExecuteActions(pair.exitActivateActions, false);
}
}
}

private bool AreAllTagsMatching(Collider other, List<string> tags)
{
foreach (var tag in tags)
{
if (!other.CompareTag(tag))
{
return false;
}
}
return true;
}

private void ExecuteActions<T>(List<T> actions, bool isEnter) where T : ITriggerAction
{
if (actions == null || actions.Count == 0) return;
foreach (var action in actions)
{
if (action != null)
{
if (isEnter)
{
action.ExecuteEnterAction();
}
else
{
action.ExecuteExitAction();
}
}
}
}
}

public abstract class ITriggerAction : ScriptableObject

{

ย  ย  public abstract void ExecuteEnterAction();

ย  ย  public abstract void ExecuteExitAction();

}