일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- l-value참조자
- const l-value참조자
- 네트워크 결합
- 프로그래머스 배열만들기4
- r-value참조자
- 값/참조/주소에 의한 전달
- 괄호 검사 프로그램
- 알고리즘 조건
- IPv4 주소체계
- const화
- 원형 연결 구조 연결된 큐
- 범위 기반 for문
- auto 키워드
- C언어 덱
- 운영체제 기능
- 주기억장치
- 백준 파이썬
- getline()함수
- string유형
- C언어 스택 연산
- 문제해결 단계
- c언어 괄호검사
- 프로그래머스 푸드 파이트 대회
- 유형 변환
- 문자형 배열
- 회전 및 자리 이동 연산
- 입출력 관리자
- C언어 계산기 프로그램
- LAN의 분류
- 논리 연산
- Today
- Total
chyam
[unity]- 2d 탑다운 [ rule tile, 이동, 물체랑 상호작용 ] 본문
>플레이어설정
글쓰다가 갑자기 오류나서 뭔가했더니 animator가 없어서 오류가 난거였다.
>rule tile 사용
땅은 전에 올렸던거랑 똑같게 한다.
이게 맞는지 정확하진 않지만 대강 해봤을때 맞는것같아서 넣었다.
>하면서 잘 안됐었던 부분
잘된 화면이다. 이전 화면은 아래에 있다.
계속 grass 타일이랑 soil 타일이 충돌하는 문제가 발생하여 왜그런지 계속 고민했다.
원래 한 타일맵에 저 두개를 넣었는데 두개로 분리하였다.
그리고 grass타일을 soil부분까지도 다 채워두고 , grass 타일맵의 레이어정렬부분을 건드렸다.
order in layer를 1로 하고, soil타일맵을 2로 하니까 괜찮아졌다.
그리고 꽃,나무,집들의 레이어들을 3으로 하고, 물부분은 2로 했다.
그리고 보이진않지만 경계부분도 만들었다.
box나 npc, desk는 order in layer를 3으로 해주었다. 그리고 box collider2D도 해주었다.
그리고 코드를 실행할때 아무키도 누르지 않았는데 캐릭터가 아래로 조금씩 이동하는 문제가 있었다. 이는 rigidbody에서 중력scale을 0으로 해주니까 해결되었다.
>코드 구현( 플레이어 이동, Raycast )
-선언부분
public float Speed;
float h;
float v;
bool isHorizonMove;
Vector3 dirVec; //현재 바라보고있는 방향값 가짐
GameObject scanObject;
Rigidbody2D rigid;
Animator anim;
-Awake부분
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
anim= GetComponent<Animator>();
}
-Update부분
1)
//Move Value
h = Input.GetAxisRaw("Horizontal");
v = Input.GetAxisRaw("Vertical");
//Check Button Down & up
bool hDown = Input.GetButtonDown("Horizontal");
bool vDown = Input.GetButtonDown("Vertical");
bool hUp = Input.GetButtonUp("Horizontal");
bool vUp = Input.GetButtonUp("Vertical");
//Check Horizontal Move
if (hDown||vUp)
isHorizonMove = true;
else if(vDown|| hUp)
isHorizonMove = h!=0; //수평 수직 판단하여 해결
hDown은 좌우를 눌렀을때인가, vDown은 상하를 눌렀을때인가를 나타내고,
hUp은 좌우를 뗏을때인가, vUp은 상하를 뗏을때인가를 나타낸다.
if문을 보면 좌우를 눌렀을때/ 상하를 뗏을때 이면, isHorizonMove가 참이다.
조건문을 보면 좌우로 움직일때니까 참이 된다.
else if의 조건은 상하로 눌렀을때/ 좌우를 뗏을때 이면, isHorizonMove가 좌우입력값이 0이 아니면 거짓이 된다. 좌우입력 값이 0이면 멈춘것이다.
2)애니메이션 부분
스프라이트로 애니메이터를 사용하려면 필요한 스프라이트들을 한번에 선택하여
원하는곳( 여기서는 Player )에 끌여다 놓고 저장하면된다.
//animation
if (anim.GetInteger("hAxisRaw") != h) {
anim.SetBool("isChange",true);
anim.SetInteger("hAxisRaw", (int)h);
}
else if (anim.GetInteger("vAxisRaw") != v)
{
anim.SetBool("isChange", true);
anim.SetInteger("vAxisRaw", (int)v);
}
else
{
anim.SetBool("isChange", false);
}
hAxisRaw가 h랑 다르면 상태가 변경되는것이므로 isChange는 true로 설정한다.
그리고 h는 float이므로 int로 형변환을 하고 이거로 hAxisRaw를 설정한다.
vAxisRaw도 같은방식으로한다.
h나 v랑 같으면 상태가 변경되는게 아니므로 isChange는 false다.
3) raycast를 위해 해야하는거
//direction
if(vDown && v == 1)
dirVec = Vector3.up;
else if(vDown&&v==-1)
dirVec = Vector3.down;
else if(hDown&&h==1)
dirVec = Vector3.right;
else if(hDown&&h==-1)
dirVec = Vector3.left;
//scan object
if (Input.GetButtonDown("Jump")&&scanObject!=null)
Debug.Log(scanObject.name);
vDown이 참이고 v가 1일때 위로 가는것이므로 dirVec(현재 바라보고 있는 방향값) 은 up을 가진다.
vDown이 참이고 v가 -1일때 아래로 가는것이므로 dirVec는 down을 가진다.
hDown이 참이고 h가 1일때 오른쪽으로 가는것이므로 dirVec는 right를 가진다.
hDown이 참이고 h가 -1일때 왼쪽으로 가는것이므로 dirVec는 left를 가진다.
아래 scan object부분은 물체와 상호작용할수있는 부분이다. 현재는 스캔한 오브젝트의 이름을 콘솔창에 띄워준다.
Jump key인 스페이스바를 누르고 scanObject가 있을때 콘솔창에 이름을 띄워준다.
-FixedUpdate부분
//Move
Vector2 moveVec = isHorizonMove ? new Vector2(h, 0) : new Vector2(0, v);
rigid.velocity = moveVec * Speed;
//ray
Debug.DrawRay(rigid.position,dirVec*0.7f,new Color(0,1,0));
RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, dirVec, 0.7f, LayerMask.GetMask("Object"));
if (rayHit.collider != null)
{
scanObject = rayHit.collider.gameObject;
}
else
{
scanObject = null;
}
맨 처음에 moveVec은 앞에 올렸던 게시물에서 수정한 부분이다.
앞에서는 플레이어가 대각선으로도 움직일수있었다. 하지만 그걸 막기위해서
좌우로 움직이는지 여부에 따라 좌우만 움직이거나 상하만 움직일수있도록 했다.
isHorizonMove가 참이면 (h,0)이 된다.
Ray를 보기위해서 DrawRay를 사용한다. (Vector3 시작위치, Vector3 방향, 색깔) 로 표시한다.
rayHit는 2D 공간에서 특정 지점에서 특정 방향으로 ray를 발사하여 충돌한 객체에 대한 정보를 반환한다.
(ray 시작위치, ray 방향, ray길이, 어떤 레이어) 로 표현한다.
rayHit가 충돌한것이 있으면 scanObject는 충돌한 게임오브젝트로 설정한다.
충돌한것이 없으면 null을 저장한다.
>애니메이터 설정
방향 전환이 바로 되도록 any state를 사용한다고한다.
Player_Down이 되려면 vAxisRaw가 0보다 작야아한다. 그리고 상태가 변화하므로 isChange를 true로 한다.
Down_idle은 아래로 보면서 멈춘상태이다. vAxisRaw가 0이어야한다.
다른것도 이런식으로 한다.
'unity' 카테고리의 다른 글
[unity]- 2d 탑다운 [ npc와 대화 + 초상화 ] (0) | 2024.07.02 |
---|---|
[unity]- 2d 탑다운 [ 대화창 UI 기본 구현, 폰트 저장 ] (0) | 2024.07.02 |
[unity]- 2d 기초 [ rule tile ] (0) | 2024.06.30 |
[unity]- 2d 도트 기초 [ 스테이지 게임 완성 ] (0) | 2024.06.30 |
[unity]-2d 기초 [ 몹에 맞으면 튕기도록 만들기] (0) | 2024.06.27 |