■ 학습 개요
○ 오늘 계획
- 유니티 입문 팀프로젝트
- 캐릭터 스텟 관리 만들기
- 캐릭터 선택창 만들기
- 캐릭터 선택(씬) -> 게임(씬) 으로 넘어갈때 데이터 유지 시키기
- 데이터 받아서 플레이어 캐릭터 설정되게 만들기
- 점프 높이 설정 튜터님께 질문
- 죽고나서 안움직이게 바꾸기
- 첼린지 꾸준 실습(1주차 세번째)
- 첼린지 특강(델리게이트)
○ 학습 회고
- 첼린지 특강(델리게이트) 기대했던 특강인 만큼 유익했다. 전에 튜터님께서 조언하신대로 강의중에는 메모를 자제하고 강의 내용 따라가기에만 집중했다. 주말에 다시 영상을 보고 내용정리를 이곳에 추가 할 예정이다.
- 캐선하고 데이터 넘기는 법을 고민했었는데, 생각난 방법이 괜찮을지 튜터님께 조언을 구해봤었다. OK하셔서 한결 가벼운 마음으로 진행했다. 자세한 내용은 아래에..
- 죽고 나서도 피격되고, 몬스터들에 치여서 움직이는 현상이 있어서 고치느라 고군분투 했다. 이것도 자세한 내용은 아래에..
■ 질답 정리
- Q1. 스크립트가 많아지다보니 Awake에서 GetComponent를 했을때 아직 생성되지 않은 컴포넌트여서 null 값이 들어온적이 있습니다.
= AddComponent를 이용하여 런타임중 컴포넌트를 추가한다면 순서가 꼬이지 않게끔 관리하기 좀 더 편함.
- Q2. start에서 변수 초기화를 해도 되는지 궁금합니다.
= start에서 변수 초기화 가능함.
= Init 같은 입력 함수들을 만들어서 변수 초기화를 모아놓고, Start 함수에서 호출하면 초기화 순서도 관리 하기 편함 (복잡한 프로젝트나 초기화 순서가 중요한 경우에 유용)
- Q3. 게임 데이터를 저장하고 불러오고 싶은데, 유니티에는 어떤 데이터 저장 방법이 있는지 궁금합니다.
= JSON을 이용할 수 있음
= using UnityEngine;에는 'PlayerPrefs' 라는 것이 있음, 이걸로 데이터를 저장하고 불러 올 수 있음. 게임(프로그램) 종료후에도 데이터가 보존 됨 (단, 보안에는 취약함)
■ 트러블 슈팅
○ 죽은 캐릭터 움직임 막기
-
문제점 : 캐릭터가 죽은 이후에도, 파이어 오브젝트에 피격당하고 몬스터에게 밀려서 이리 저리 밀쳐진다🥲
-
해결책 : 죽는 시점에 플레이어 게임오브젝트의 콜라이더를 꺼버린다.
-
문제점2 : 콜라이더가 사라져서 바닥 밑으로 영원히 떨어진다. 그리고 이렇게 해도 이동 입력 눌르면 이동방향대로 x축 플립되는 문제도 있음
-
해결책2 : Rigidbody2D를 가져와서 x와 y를 얼려버리기
-
해결책3 : 스프라이터 렌더러를 받아와서 플립x도 영원히 막기
-
결과 : 의도대로 더이상 움직여지지도 플립되지도, 피격되지도 않음
// 이 함수를 플레이어가 죽는 시점이 있는 코드에 부착했다
private void DeadSet()
{
Collider2D playerCollider = playerObject.GetComponent<Collider2D>();
if (playerCollider != null)
{
playerCollider.enabled = false; // 콜라이더 비활성화
}
Rigidbody2D playerRigidbody = playerObject.GetComponent<Rigidbody2D>();
if (playerRigidbody != null)
{
playerRigidbody.constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezePositionY;
}
_spriteRenderer.flipX = false;
player.isDead = true;
}
○ 다음 씬으로 데이터 넘기는 법
- 고민 : 캐릭터선택 씬에서 캐릭터를 선택하면 선택 정보를 저장하고, 그 정보를 다음 씬에서도 유지 할 수있어야 한다. 그 정보를 받아서 플레이어 오브젝트를 초기화해서 선택된 캐릭터가 플레이 되게끔 만들어야한다.
- 해결책 : 데이터를 저장할 게임 오브젝트를 만들고, 씬 로드 과정에 파괴되지 않도록 한다. 다음 씬으로 넘어가면 플레이어가 남아있는 게임데이터 오브젝트에서 정보를 받아와서 초기화 하도록 한다. 아래와 같은 스크립트를 만들고 게임데이터 오브젝트에 부착했다.
- 결과 : 다음씬에서도 건재했다
using UnityEngine;
public class DontDestroy : MonoBehaviour
{
void Awake()
{
DontDestroyOnLoad(gameObject);
}
}