일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c언어 괄호검사
- auto 키워드
- 알고리즘 조건
- getline()함수
- C언어 스택 연산
- r-value참조자
- LAN의 분류
- 원형 연결 구조 연결된 큐
- 주기억장치
- 문제해결 단계
- const l-value참조자
- const화
- 운영체제 기능
- 문자형 배열
- string유형
- 프로그래머스 푸드 파이트 대회
- C언어 덱
- 값/참조/주소에 의한 전달
- 논리 연산
- 백준 파이썬
- 입출력 관리자
- l-value참조자
- 네트워크 결합
- 유형 변환
- 프로그래머스 배열만들기4
- IPv4 주소체계
- 괄호 검사 프로그램
- C언어 계산기 프로그램
- 회전 및 자리 이동 연산
- 범위 기반 for문
- Today
- Total
chyam
[unity]- 2d 기초 [자동으로 움직이는 몹] 본문
>자동으로 움직이는 몹 만들기
먼저 목표는
1) 몹이 랜덤한 일정시간동안 왼쪽/멈추기/오른쪽으로 이동하는것
2) 낭떠러지가 있으면 몹이 반대방향으로 가는것 이다.
먼저 클래스의 변수 먼저 살펴보면,
Rigidbody2D rigid;
public int nextMove;
Animator anim;
SpriteRenderer spriteRenderer;
rigid, anim, spriteRenderer 변수 만들어주고, 직접 조정가능한 nextMove도 만들어준다.
Awake함수를 살펴보면,
void Awake()
{
rigid=GetComponent<Rigidbody2D>();
anim=GetComponent<Animator>();
spriteRenderer=GetComponent<SpriteRenderer>();
Invoke("Think", 5); //Think라는 함수를 5초뒤에 호출한다
}
변수들을 초기화해준다. Think함수를 통해서 처음에 nextMove도 초기화해준다.
FixedUpdate함수를 살펴보면,
void FixedUpdate()
{
//기본 움직임
rigid.velocity=new Vector2(nextMove, rigid.velocity.y);
//지형 체크. *0.3f해주면 광선 위치가 더 줄어든다
Vector2 frontVector = new Vector2(rigid.position.x + nextMove*0.3f, rigid.position.y);
Debug.DrawRay(frontVector, Vector3.down, new Color(0, 1, 0));
RaycastHit2D rayHit = Physics2D.Raycast(frontVector, Vector3.down, 1, LayerMask.GetMask("Flatform"));
if (rayHit.collider == null)
{
Turn();
}
}
기본 속도는 x부분은 nextMove로, y는 그대로한다.
위치의 x부분은 원래 위치에 nextMove를 더해준다.
그냥 더하면 위의 사진처럼 캐릭터보다 nextMove자체만큼 앞에있다.
*0.3f를 해주면 위의 사진처럼 캐릭터의 앞부분에 ray가 있는것을 알수있다.
rayHit는 전에도 말했듯이 뒤에서 down부분에 광선을 쏘아서 충돌되는지를 볼수있다.
만약 rayHit.collider이 null이면 충돌하지 않으므로 방향을 바꿔줘야한다.
그래서 Turn함수를 실행해준다.
Think함수를 살펴보면,
void Think()
{
//move
nextMove = Random.Range(-1, 2);//1까지라서
anim.SetInteger("Walk Speed", nextMove);
if(nextMove!=0)
spriteRenderer.flipX = nextMove == 1;
float nextThinkTime = Random.Range(2f, 6f);
Invoke("Think", nextThinkTime);
}
nextMove는 -1에서 1사이의 정수값이다.
Walk Speed는 애니메이터에 새로 추가한 int형 이다.
walk->idle으로 갈때는 움직임이 0이어야하므로 Walk Speed는 0이어야하고,
idle-> walk로 갈때는 움직임이 0이아니어야한다.
만약 nextMove가 0이아닐때, 처음 바라보는 방향이 왼쪽이므로, nextMove가 1이라면 저 식은 참이되므로 뒤집혀진다.
nextThinkTime은 Invoke가 실행되는 시간으로 랜덤값을 가진다. (2초~6초)
다음으로 Turn함수를 살펴보면,
void Turn()
{
//방향바꾸기
nextMove = nextMove * -1;
spriteRenderer.flipX = nextMove == 1;
CancelInvoke();
Invoke("Think", 5);
}
이는 방향을 바꿔서 가는함수이다.
단순하게 nextMove에 -1를 곱해주면 반대로 간다.
이때도 반대를 봐야하므로 filpX를 건들여준다.
Invoke는 주어진 시간이 지난뒤 지정된 함수를 실행시켜준다.
그리고 CancelInvoke는 현재 작동중인 모든 Invoke함수를 멈추는 함수이다.
'unity' 카테고리의 다른 글
[unity]- 2d 기초 [ rule tile ] (0) | 2024.06.30 |
---|---|
[unity]- 2d 도트 기초 [ 스테이지 게임 완성 ] (0) | 2024.06.30 |
[unity]-2d 기초 [ 몹에 맞으면 튕기도록 만들기] (0) | 2024.06.27 |
[unity]-2d 기초 [중력, raycast,타일맵] (0) | 2024.06.26 |
[unity]- 2d 기초 [충돌, slice, 애니메이터 기초] (0) | 2024.06.25 |