(주) 망나니 힘집
[탑다운] 십자가 이동, 애니메이션 설정, 조사 액션 본문
이 글은 골드메탈님 수업을 듣고 작성하였습니다.
* 십자가 이동 *
//대각선 이동을 막는 이동방법
public class PlayerMove : MonoBehaviour
{
float h;
float v;
bool isHorizonMove;
bool isVerticalMove;
public float Speed;
Rigidbody2D rigid;
// Start is called before the first frame update
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
h = Input.GetAxisRaw("Horizontal");
v = Input.GetAxisRaw("Vertical");
//버튼 다운,업 확인하기
//GetButtonDown : 버튼을 눌렀을 때
//GetButtonUp : 버튼을 뗐을 때
bool hDown = Input.GetButtonDown("Horizontal");
bool vDown = Input.GetButtonDown("Vertical");
bool hUp = Input.GetButtonUp("Horizontal");
bool vUp = Input.GetButtonUp("Vertical");
//isHorizontal 체크하기
//버트 업으로도 수평이동 체크 가능
if (hDown || vUp)
isHorizonMove = true ;
else if (vDown || hUp)
isHorizonMove = false;
}
void FixedUpdate()
{
//플래그 변수 하나로 수평, 수직 이동을 결정
// if 문과 ? 둘 다 가능
Vector2 moveVec = isHorizonMove ? new Vector2(h, 0) : new Vector2(0, v);
rigid.velocity = moveVec * Speed;
}
}
* 탑다운 애니메이션 설정 *
앞으로 걷는 모습, 뒤로 걷는 모습, 양 옆으로 걷는 모습들을 각각 분리지어 Player에게 애니메이션을 집어넣습니다.
또한 옆으로 서서 멈춰있는 모습, 뒤로 서서 멈춰있는 모습 등도 같이 넣어줍니다.
그 후 애니메이터[window] 를 엽니다.
//Any State : 방향 전환이 바로 되도록 해준다.
Transition Duration = 0 으로 맞춰줍니다.
Has Exit Time 체크 해제 해줍니다.
그리고 Loop time 은 꼭 체크 해줍니다.
이런식으로 상하좌우를 정해준다.
hAxisRaw 와 vAxisRaw 를 정하여 상태에 -1 , 0 ,1 을 추가하여 준다.
상하좌우
오른쪽 walk -> hAxisRaw == 1
왼쪽 walk -> hAxisRaw == -1
위 walk -> vAxisRaw == 1
아래 walk -> vAxisRaw == -1
Idel == 0 으로 설정한다.
*스크립트*
//애니메이션 말고 애니메이터 선언!
Animator anim;
//초기화
anim = GetComponent<Animator>();
//애니메이션
//int 를 썼기 때문에 Integer
//타입이 달라 형변환시킨다.
anim.SetInteger("hAxisRaw", (int)h);
anim.SetInteger("vAxisRaw", (int)v);
* 주의 : Transition 을 연속적으로 태우면 애니메이션이 작동되지 않기 때문에 Transition 을 한번만 줘야 한다.
-> 해결방법
if(anim.GetInteger("hAxisRaw") != h)
anim.SetInteger("hAxisRaw", (int)h);
if (anim.GetInteger("vAxisRaw") != v)
anim.SetInteger("vAxisRaw", (int)v);
이렇게 작성한 후
animator 에 있는 Can Transition To 를 체크 해제해주면 된다.
//주의 : 양쪽 버튼을 누르다가 한 쪽 버튼을 떼면 이동 문제가 발생.
-> 해결방법 : 현재 AxisRaw 값에 따라 수평, 수직 판단해서 해결한다.
if (hDown)
isHorizonMove = true ;
else if(vDown)
isHorizonMove = false;
else if (vDown || hUp)
isHorizonMove = h != 0 ;
-> 해결.
Q . 대각선도 이동하려면?
isHorizontalMove 관련 부분만 제외하면 된다 !!
* 조사 액션 *
: player 앞에 존재하는 사물을 스캔하는 행동이다.
☆Ray☆ 활용
//현재 바라보고 있는 방향 값을 가진 변수가 필요하기 때문에 변수를 하나 선언.
Vector3 dirVec;
void Update(){
//방향
//상
if (vDown && v == 1)
dirVec = Vector3.up;
//하
else if (vDown && v == -1)
dirVec = Vector3.down;
//좌
else if(hDown && h == -1)
dirVec = Vector3.left;
//우
else if(hDown && h == 1)
dirVec = Vector3.right;
}
void FixedUpdate(){
//Ray
//길이 : 0.7
//색 : 녹색
Debug.DrawRay(rigid.position, dirVec *0.7f , new Color(0,1,0));
}
//ray 는 게임 화면에선 안 보이고 씬에서만 보인다.
//RayCast 작성 : 레이가 콜라이더에 충돌했는지 참/거짓으로 판단
// player 콜라이더를 무시해야 한다. -> 레이어 추가
//조사 가능한 오브젝트를 다른 Layer로 설정을 한다 (즉, npc , 사물 등)
RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, dirVec, 0.7f, LayerMask.GetMask("object"));
// 스캔이 되었다는 것을 저장하는 변수를 선언
GameObject scanObject;
//감지
//raycast 된 오브젝트를 변수로 저장하여 활용한다.
void FixedUpdate(){
if(rayHit.collider != null)
{
scanObject = rayHit.collider.gameObject;
}
else
scanObject = null;
}
void Update(){
//오브젝트 스캔 출력
if (Input.GetButtonDown("Jump") && scanObject != null)
Debug.Log("이것은" + scanObject.name + "입니다.");
}
//주의 : 오브젝트에도 collider 컴포넌트가 있어야만 한다.
>>>이것은 [ ] 입니다.
'유니티 최고 > Unity Game Making' 카테고리의 다른 글
[탑다운] 초상화 (0) | 2022.01.20 |
---|---|
[탑다운] 오브젝트 관리 , 대화 시스템 (0) | 2022.01.20 |
[탑다운] 대화창 UI, 데이터 전달, 상태 전환, UI 애니메이션 (1) | 2022.01.19 |
[탑다운] 룰타일, 애니메이션 타일, 외부 경계 설정, 픽셀 퍼펙트 (0) | 2022.01.18 |