오늘은 강의를 조금 복습해보고, 유니티로 개인 프로젝트를 진행했다. 진행 중 구현했던 몇 가지 주요 기능들과 문제들을 몇 가지 정리하고자 한다.
Box Collider 2D 컴포넌트를 붙여주었다.Collider 범위보다 조금 더 넓게, 그리고 isTrigger를 활성화시켜서 범위 안에 들어갔을 때에 상호작용 할 수 있도록 만들었다.Collider 사용.IsTrigger = true. 물리적 충돌을 담당한다.OnTriggerEnter2D를 활용하였다.BaseNPCControllerpublic class BaseNPCController : MonoBehaviour
{
protected bool isPlayerInRange = false;
.
.
.
protected virtual void OnTriggerEnter2D(Collider2D collider2D)
{
if (collider2D.CompareTag("Player"))
{
isPlayerInRange = true;
Debug.Log("플레이어 접근");
}
}
.
.
.
public virtual void Interact()
{
Debug.Log("NPC와 상호작용");
}
}
ElfNPC, DwalfNPC 등//ElfNPC 예시
public class ElfNPC : BaseNPCController
{
public override void Interact()
{
Debug.Log("엘프 NPC와 상호작용했습니다.");
}
}
이를 통해 다양한 NPC들을 손쉽게 추가할 수 있었다.
MainScene의 ElfNPC 스크립트는 Scripts/MainScene/NPC/ElfNPC.cs와 같은 식으로 스크립트를 구성하였고 애니메이션도 마찬가지로 구성하였다.[SerializeField] vs public ?public은 해당 변수를 어떤 다른 스크립트에서도 접근할 수 있기 때문에 예상치 못한 버그가 발생할 수 있다.[SerializeField]를 활용하면 변수 접근은 제한하면서 Inspector 창에 노출은 가능하다.public을 사용하고, 그렇지 않은 경우에는 [SerializeField]를 활용하는 것이 좋겠다.PlayerPrefs 활용PlayerPrefs는 유니티에서 제공하는 가장 간단한 데이터 저장 방식이다.int, float, string 타입의 데이터를 저장하고 불러올 수 있다.//F_GameManager.cs
public class F_GameManager : MonoBehaviour
{
.
.
.
private void Awake()
{
.
.
.
bestScore = PlayerPrefs.GetInt(BestScoreKey, 0);
.
.
.
public void CheckBestScore()
{
if (currentScore > bestScore)
{
bestScore = currentScore;
PlayerPrefs.SetInt(BestScoreKey, bestScore);
.
.
.
PlayerPrefs는 보안에 취약하다는 약점이 있다. 데이터가 암호화되지 않기 때문이다.NPC오브젝트 뿐만 아니라, 여러 적 몬스터나 투사체, 무기 등을 만들 때에도 효과적으로 사용할 수 있겠다.[SerializeField], PlayerPrefs등의 용도를 제대로 알고 나니 사용하게 훨씬 편리했다.