먼저 한 방향으로 움직이는 오브젝트를 만들어준다.
Vector3 MoveV;
int vec; //이동 방향을 저장한 변수
int speed;
private void Awake()
{
speed = 1;
vec = 1;
}
void Update()
{
MoveV = new Vector3(vec, 0, 0);
transform.position += MoveV * Time.deltaTime * speed;
Vector2 front = new Vector2(transform.position.x + vec*0.5f, transform.position.y);
}
여기서 토끼의 진행방향에 Laycast를 생성해준 후, 그 Laycast가 border태그를 가진 오브젝트를 만나면 진행방향을 바꿔준다.
DrawLay기능을 이용해서 laycast가 생성되는 위치를 씬에서 확인할 수 있다.
Vector2 front = new Vector2(transform.position.x + vec*0.5f, transform.position.y);
Debug.DrawRay(front, Vector3.down, new Color(0, 1, 0));
Update문에 이와같이 내가 레이를 생성하고 싶은 위치를 넣고, 확인후 적당한 위치를 정한다.
private void Awake()
{
speed = 1;
vec = 1;
}
void Update()
{
MoveV = new Vector3(vec, 0, 0);
transform.position += MoveV * Time.deltaTime * speed;
Vector2 front = new Vector2(transform.position.x + vec*0.5f, transform.position.y);
Debug.DrawRay(front, Vector3.down, new Color(0, 1, 0));
RaycastHit2D rayHitborder = Physics2D.Raycast(front, Vector3.down, 1,
LayerMask.GetMask("border"));//태그가 border인 오브젝트와 hit한다면 null이외를 반환하므로
if (rayHitborder.collider != null)
{
turn(); //방향을 바꿔주는 함수를 호출
}
}
void turn()
{
vec *= -1;//방향을 바꿔준다.
transform.localScale = new Vector2(transform.localScale.x * -1, transform.localScale.y);
//진행 방향에 맞게 오브젝트도 좌우 반전
}
위와 같이 토끼는 벽에 닫지 않았지만, raycast가 border를 반환하는 점에서 토끼의 방향이 바뀌는 모습을 볼 수 있다.
raycast를 활용하면 위와같이 진행방향에 벽이 있는 상황 뿐 아니라 , 바닥이 비어있는 부분에서도 방향을 바꾸게 할 수 있다.
Vector3 MoveV;
int vec;
int speed;
private void Awake()
{
speed = 5;
vec = 1;
}
void Update()
{
MoveV = new Vector3(vec, 0, 0);
transform.position += MoveV * Time.deltaTime * speed;
Vector2 front = new Vector2(transform.position.x + vec*0.5f, transform.position.y);
Debug.DrawRay(front, Vector3.down, new Color(0, 1, 0));
RaycastHit2D rayHitblock = Physics2D.Raycast(front, Vector3.down, 1, LayerMask.GetMask("block"));
//블럭이 잇는지 확인
RaycastHit2D rayHitborder = Physics2D.Raycast(front, Vector3.down, 1, LayerMask.GetMask("border"));
if (rayHitborder.collider != null)
{
turn();
}
else //앞에 벽은 없지만, 바닥도 없을 경우에도 turn함수를 호출함
if (rayHitblock.collider == null)
{
turn();
}
}
void turn()
{
vec *= -1;
transform.localScale = new Vector2(transform.localScale.x * -1, transform.localScale.y);
}
위와 같이 가고싶은 길에 바닥이 없거나, 벽이 있으면 스스로 방향을 바꾸는 코드였다.
'유니티' 카테고리의 다른 글
[유니티] 일정한 속도로 회전하는 오브젝트 만들기 (0) | 2022.05.05 |
---|---|
[유니티] 일정 시간 후에 자동으로 사라지는 오브젝트 만들기 (0) | 2022.05.05 |
[유니티] 코루틴(Coroutine)에 대해 알아보자 (0) | 2022.05.04 |
[유니티] 내 주변을 원 모양으로 퍼지는 탄환 생성 (0) | 2022.04.29 |
[유니티] 내 주변을 원 운동하는 오브젝트 만들기 (2) | 2022.04.28 |