using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyMovement : MonoBehaviour
{
Rigidbody2D rigid;
Animator anim;
SpriteRenderer sprite;
CapsuleCollider2D collide;
public int nextMove;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
sprite = GetComponent<SpriteRenderer>();
collide = GetComponent<CapsuleCollider2D>();
}
void Think()
{
nextMove = Random.Range(-1, 2);
anim.SetInteger("walkSpeed", nextMove);
if (nextMove != 0)
{
sprite.flipX = nextMove == 1;
}
float nextThinkTime = Random.Range(2f, 5f);
Invoke("Think", nextThinkTime);
}
void FixedUpdate()
{
rigid.velocity = new Vector2(nextMove, rigid.velocity.y);
Vector2 frontVec = new Vector2(rigid.position.x + nextMove * 0.2f, rigid.position.y);
Debug.DrawRay(frontVec, Vector3.down, new Color(0, 1, 0));
RaycastHit2D rayHit = Physics2D.Raycast(frontVec, Vector3.down, 1, LayerMask.GetMask("Platform"));
if (rayHit.collider == null)
{
Turn();
}
}
void Turn()
{
nextMove *= -1;
sprite.flipX = nextMove == 1;
CancelInvoke();
Invoke("Think", 3);
}
public void OnDamaged()
{
sprite.color = new Color(1, 1, 1, 0.4f);
sprite.flipY = true;
collide.enabled = false;
rigid.AddForce(Vector2.up * 5, ForceMode2D.Impulse);
Invoke("DeActive", 3);
}
void DeActive()
{
gameObject.SetActive(false);
}
}
컴포넌트를 저장하기 위해서 변수를 선언한다.
선언 방식은 자료형 + 변수이름 ; 이다.
Rigidbody2D rigid;
위의 예시로 Rigidbody2D라는 자료형을 저장할
rigid라는 이름의 변수를 선언하고
세미콜론을 마지막으로 붙여준다.
Component(컴포넌트)는 Object(오브젝트)에 기능을 부여하는 요소이다.
예로 하면 Rigidbody2D, Collider, 스크립트 등이 있다.
이번에 설명할 컴포넌트는 Enemy 코드에서의 사용 중인 Rigidbody2D, Animator, SpriteRenderer, Collider를 설명하고, 어디서 어떻게 사용되고 있는지 말해보겠습니다.
Rigidbody2D는 2D 오브젝트의 물리적인 움직임을
담당하는 컴포넌트입니다.
다양한 물리 기능을 사용할 수 있다.
velocity : 속도
AddForce : 힘
ForceMode2D.Impulse : 순간적인 힘
등이 있다.
rigid.velocity = new Vector2(nextMove, rigid.velocity.y);
Rigidbody2D의 velocity를 사용하여 x축은 이동 방향을 변경하고 x의 속도만큼 이동하고, y축은 현재의 속도를 받아는다. 이렇게 해서 자연스러운 물리 이동을 한다.
Collider는 오브젝트의 충돌 판정을 담당하는 컴포넌트입니다.
콜라이더도 기능이 있다.
enabled : 충돌 기능 끄기
Trigger : 오브젝트가 통과는 가능한데 충돌 감지는 가능함
등이 있다.
if (rayHit.collider == null)
레이히트에게 충돌판정을 받는데 충돌 판정값에 널 값이 들어오면 이프문을 실행한다.
위의 코드는 타일맵 콜라이더 때문에 그냥 콜라이더2D을 쓰면 자꾸 멈추는게 있어서 CapsuleCollider2D을 선배님의 조언을 받아서 사용했습니다.
SpriteRenderer는 2D 스프라이트 이미지를 화면에 출력하는 컴포넌트이다.
스프라이트렌더러의 기능은
flipX : 스프라이트 좌우 반전 기능
flipY : 스프라이트 상하 반전 기능
color : 색상/투명도 설정
등이 있다.
sprite.color = new Color(1, 1, 1, 0.4f);
sprite.flipY = true;
위에는 스프라이트의 색에 약간의 투명도를 준다.
아래는 스프라이트의 상하을 반전시킨다.
Animator는 오브젝트의 애니메이션을 제어하는 컴포넌트이다.
애니메이터의 기능은
SetInteger : 정수값을 애니메이터에게 전달하는 기능
SetFloat : 실수값을 애니메이터에게 전달하는 기능
SetBool : true / false을 애니메이터에게 전달하는 기능
SetBool : true / false을 애니메이터에게 전달하는 기능
등이 있다.
anim.SetInteger("walkSpeed", nextMove);
WalkSpeed라는 애니메이터의 변수에 넥스트무브의 정수값을 전달한다.