2023. 8. 31. 13:55ㆍUnity
소행성 장애물을 추가하기 위해 스프라이트를 설정한 후 스크립트를 만들어서 적용할 것이다.
public class AsteroidScript : MonoBehaviour
{
public float asteroidSpeed = 5;
public float rotationspeed = 30;
void Update()
{
transform.position += Vector3.left * Time.deltaTime * asteroidSpeed;
transform.Rotate(new Vector3(0, 0, Time.deltaTime * rotationspeed));
}
}
소행성의 이동과 회전을 같이 스크립트에 적용하면 그대로 동작하는 것을 볼 수 있다.
public class AsteroidScript : MonoBehaviour
{
public float asteroidSpeed = 5;
public float rotationspeed = 30;
void Update()
{
transform.Translate(Vector3.left * Time.deltaTime * asteroidSpeed);
transform.Rotate(new Vector3(0, 0, Time.deltaTime * rotationspeed));
}
}
**여기서 transform.position 대신 transform.Translate을 쓰면 이상한 오류가 발생한다. transform.Translate을 사용할 경우 기본적으로 로컬 좌표를 이용하여 회전이 되면 회전된 축 방향으로 이동하기 때문이다.
public class AsteroidScript : MonoBehaviour
{
public float asteroidSpeed = 5;
public float rotationspeed = 30;
void Update()
{
transform.Translate(Vector3.left * Time.deltaTime * asteroidSpeed, Space.World);
transform.Rotate(new Vector3(0, 0, Time.deltaTime * rotationspeed));
}
}
transform.Translate(..., Space.World);로 월드 스페이스 기준으로 설정해야 제대로 작동하는 것을 볼 수 있다.
컴포넌트로 Circle Collider 2D, Rigidbody 2D - Kinematic, Asteroid 이름으로 태그를 추가한 후 프리팹으로 만들었다.
미사일이 소행성에 충돌한다면 소행성을 감지해야 하기 때문에 미사일 프리팹의 콜라이더에 Is Trigger를 활성화 해야한다. Rigidbody 2D는 미사일과 소행성 둘 다 Kinematic이 활성화되어있어야 한다.
public class ShootScript : MonoBehaviour
{
public float speed = 10;
void Update()
{
transform.position += Vector3.right * Time.deltaTime * speed;
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
void OnTriggerEnter2D(Collider2D collision)
{
print(collision.tag);
if(collision.tag == "Asteroid")
{
Destroy(collision.gameObject);
}
}
}
OnTriggerEnter2D 함수를 추가하여 "Asteroid" 태그가 붙은 충돌체를 지운다고 스크립트에 추가하였다.
미사일에 닿은 소행성이 지워지는 것을 볼 수 있다.
public class ShootScript : MonoBehaviour
{
public float speed = 10;
void Update()
{
transform.position += Vector3.right * Time.deltaTime * speed;
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
void OnTriggerEnter2D(Collider2D collision)
{
print(collision.tag);
if(collision.tag == "Asteroid")
{
Destroy(this.gameObject);
}
}
}
Destroy(this.gameObject);로 지정하면 미사일 자신이 소행성에 닿으면 지워지는 것을 볼 수 있다.
물리계산을 하기 위해 Layer를 지정해주고, Physics 2D에서 체크를 해야 한다.
전부 체크하면 서로가 모두 충돌한다는 의미이기 때문에 성능에 무리가 갈 수도 있다. 따라서 필요한 레이어만 충돌하게 체크를 해주면 된다.
맞는 레이어를 설정한다.
소행성 체력 추가
Asteroid 스크립트에 체력을 추가하고, 이전에 만들었던 ShootScript에 AsteroidScript를 가져와서 소행성의 체력이 일정 수치 이하가 되면 파괴되도록 설정할 것이다.
public class AsteroidScript : MonoBehaviour
{
public float asteroidSpeed = 5;
public float rotationspeed = 30;
public int hp = 10;
void Update()
{
transform.Translate(Vector3.left * Time.deltaTime * asteroidSpeed, Space.World);
transform.Rotate(new Vector3(0, 0, Time.deltaTime * rotationspeed));
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
}
이전 Asteroid 스크립트에 hp를 public으로 추가하였다.
public class ShootScript : MonoBehaviour
{
public float speed = 10;
void Update()
{
transform.position += Vector3.right * Time.deltaTime * speed;
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
void OnTriggerEnter2D(Collider2D collision)
{
print(collision.tag);
if(collision.tag == "Asteroid")
{
AsteroidScript asteroidScript = collision.gameObject.GetComponent<AsteroidScript>();
asteroidScript.hp -= 3;
if(asteroidScript.hp <= 0 )
{
Destroy(collision.gameObject);
}
Destroy(gameObject);
}
}
}
그리고 ShootScript에서 AsteroidScript를 불러와서 hp 변수를 가져다가 3씩 줄이고 0 이하가 되면 없애는 조건식을 추가하였다.
네 번째 미사일에 소행성이 파괴되며, 잘 작동하는 것을 볼 수 있다.
'Unity' 카테고리의 다른 글
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(7) 젬 생성 (0) | 2023.08.31 |
---|---|
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(6) Hit 이펙트 추가 (0) | 2023.08.31 |
[Unity] Euler 회전과 Quaternion 회전 (0) | 2023.08.28 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(4) 미사일 발사 (0) | 2023.08.28 |
[Unity] Tag와 Layer (0) | 2023.08.24 |