티스토리 뷰

반응형

Gamelog 04. 게임이 보이기 시작했다.

어제 리지드바디랑 콜라이더를 살짝 했을 뿐인데, 게임 영상에서 무언가 보이는 느낌이었다. "오, 공격키 계속 눌러도 되네!"는 Update()에 넣어놓고 FixedUpdate()에서 주기적으로 처리하게 한거구나. 날개를 달고 안달고에 따라 부딪히고 안부딪히고는 어떻게 한지는 모르겠지만 콜라이더가 적용되고 안되게 했구나 느낌정도랄까. 재미로 보던 게임 영상에서 뭔가 배우는 느낌으로 업그레이드된 것 같다.
이번엔 키보드도 쓰고 충돌도 하고 게임클리어/오버 나오니까 이제 뭔가 좀 하는 느낌이랄까? 제대로 하면 진짜 머리 많이 써야될 것 같은 기분

 

Gamelog 04_1. 뒤쫓아오게 했다.

쫓아가기 위해 필요한 것은 하기와 같다.

  1. 목표 오브젝트 찾기
  2. 목표 방향으로 이동하기
public string targetObjectName;
//코드생략
void Start() {
	# 1. 목표 오브젝트 찾기
    targetObject = GameObject.Find(targetObjectName);
    rbody = GetComponent<Rigidbody2D>();
    //코드생략
}

# 2. 목표 방향으로 이동하기
void FixedUpdate() {
    Vector3 dir = (targetObject.transform.position - this.transform.position).normalized; // 방향
    float vx = dir.x * speed;
    float vy = dir.y * speed;
    rbody.velocity = new Vector2(vx, vy); // 이동
    this.GetComponent<SpriteRenderer>().flipX = (vx < 0);
}

normalized

  • 방향은 유지한 채 길이가 1.0인 벡터 생성
  • 붙이지 않으면, 2개의 오브젝트간의 거리가 되므로, 거리가 멀 때는 빠르게, 가까울 때는 느리게 쫓아가게 됨
  • 붙이면, 오브젝트 간 거리와 상관 없이 일정한 속도로 뒤쫓아가게 됨

 

public string targetObjectName;

public 값으로 설정하여 targetObjectName을 인스펙터 창에서 변경할 수 있도록 한다.

Unity 쫓아가기

RigidBody와 Collider를 설정한 뒤, Script를 적용하면 쫓아가게 할 수 있다. Collider와 닿으면 멈춘다.

 

Gamelog 04_2. 충돌을 다양하게 해봤다.

충돌시 반전

void OnCollisionEnter2D(Collision2D collision): 충돌할때 실행되는 메소드

void OnCollisionEnter2D(Collision2D collision) {
    speed = -speed;
    this.GetComponent<SpriteRenderer>().flipX = (speed < 0);
}

Unity 충돌시 반전

 

충돌시 정지

게임 전체의 움직임을 멈추는 방법

Time.timeScale = 0; // 시간 정지, FixedUpdate 정지
Time.timeScale = 1; // 시간 움직임, FixedUpdate 계속 실행

목표 오브젝트를 설정하고, 해당 오브젝트와 부딪혔을 경우에 게임이 중지되도록 설정

public string targetObjectName;	// 목표설정
void Start() {
    Time.timeScale = 1;		// 게임 리플레이시 자연스럽게 시작하기 위함
}
void OnCollisionEnter2D(Collision2D collision){
    Time.timeScale = 0;		// 게임 중지
}

Unity 충돌시 정지

 

충돌시 삭제/표시

public string targetObjectName;
public string hideObjectName;
public string showObejctName;

GameObject showObject;
void Start() {
	showObject = GameObject.Find(showObjectName);
    showObject.SetActive(false);
}

void OnCollisionEnter2D(Collision2D collision) {
	// 충돌한 것이 목표 오브젝트일 경우, 지울 오브젝트 지우기
	if (collision.gameObject.name == targetObjectName) {
    	GameObject hideObject = GameObject.Find(hideObjectName);
        hideObject.SetActive(false);	// 숨김, true시 표시
    }
    // 충돌한 것이 목표 오브젝트일 경우, 보여줄 오브젝트 표시하기
 	if (collision.gameObject.name == targetObjectName) {
    	showObject.SetActive(true);
    }
}

Unity 충돌시 표시/삭제

 

Multi Collision 사용시

showObject.SetActive(false)를 사용하여 지우면, 첫번째 유령 외에는 '게임오버'를 찾을 수 없음. 따라서 화면 밖으로 사라지도록 구현 필요. 

GameObject showObject;
float orgY = 0;
float ofsetY = 10000; // 이 값을 Y 방향에 더하는 것으로 지운다

void Start() { 
    showObject = GameObject.Find(showObjectName); // 오브젝트 기억
    orgY = showObject.transform.position.y; 	  // 위치 기억
    if (orgY > ofsetY) {
        orgY -= ofsetY;
    }
    Vector3 pos = showObject.transform.position;
    pos.y = orgY + ofsetY;
    showObject.transform.position = pos;
}

void OnCollisionEnter2D(Collision2D collision) {
    if (collision.gameObject.name == targetObjectName) {
        Vector3 pos = showObject.transform.position;
        pos.y = orgY;  // 원래 위치로
        showObject.transform.position = pos;
    }
}

Unity Multi Collision

 

반응형
댓글