티스토리 뷰
반응형
어제 리지드바디랑 콜라이더를 살짝 했을 뿐인데, 게임 영상에서 무언가 보이는 느낌이었다. "오, 공격키 계속 눌러도 되네!"는 Update()에 넣어놓고 FixedUpdate()에서 주기적으로 처리하게 한거구나. 날개를 달고 안달고에 따라 부딪히고 안부딪히고는 어떻게 한지는 모르겠지만 콜라이더가 적용되고 안되게 했구나 느낌정도랄까. 재미로 보던 게임 영상에서 뭔가 배우는 느낌으로 업그레이드된 것 같다.
이번엔 키보드도 쓰고 충돌도 하고 게임클리어/오버 나오니까 이제 뭔가 좀 하는 느낌이랄까? 제대로 하면 진짜 머리 많이 써야될 것 같은 기분
Gamelog 04_1. 뒤쫓아오게 했다.
쫓아가기 위해 필요한 것은 하기와 같다.
- 목표 오브젝트 찾기
- 목표 방향으로 이동하기
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 값으로 설정하여 targetObjectName을 인스펙터 창에서 변경할 수 있도록 한다.
RigidBody와 Collider를 설정한 뒤, Script를 적용하면 쫓아가게 할 수 있다. Collider와 닿으면 멈춘다.
Gamelog 04_2. 충돌을 다양하게 해봤다.
충돌시 반전
void OnCollisionEnter2D(Collision2D collision): 충돌할때 실행되는 메소드
void OnCollisionEnter2D(Collision2D collision) {
speed = -speed;
this.GetComponent<SpriteRenderer>().flipX = (speed < 0);
}
충돌시 정지
게임 전체의 움직임을 멈추는 방법
Time.timeScale = 0; // 시간 정지, FixedUpdate 정지
Time.timeScale = 1; // 시간 움직임, FixedUpdate 계속 실행
목표 오브젝트를 설정하고, 해당 오브젝트와 부딪혔을 경우에 게임이 중지되도록 설정
public string targetObjectName; // 목표설정
void Start() {
Time.timeScale = 1; // 게임 리플레이시 자연스럽게 시작하기 위함
}
void OnCollisionEnter2D(Collision2D collision){
Time.timeScale = 0; // 게임 중지
}
충돌시 삭제/표시
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);
}
}
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' 카테고리의 다른 글
Gamelog 06. Main Camera를 지웠다. (0) | 2023.01.28 |
---|---|
Gamelog 05. 쉬운게 역시 재밌다. (0) | 2023.01.25 |
Gamelog 03. 키보드를 쓰기 시작했다. (0) | 2023.01.24 |
Gamelog 02. 스크립트를 깔짝대본다. (0) | 2023.01.22 |
Gamelog 01. 게임을 못 만들 뻔했다. (0) | 2023.01.22 |
댓글