[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(11) 젬 점수, 젬 먹기
2023. 9. 18. 16:42ㆍUnity
728x90
반응형
가장 먼저, GemScript에서 gem 변수를 추가한다.
public class GemScript : MonoBehaviour
{
public float gemSpeed = 2;
public float gem = 1;
void Update()
{
transform.position += Vector3.left * Time.deltaTime * gemSpeed;
}
private void OnBecameInvisible()
{
Destroy(gameObject);
}
}
다음 AsteroidScript에서도 gem을 2 값으로 추가한다.
public class AsteroidScript : MonoBehaviour
{
public float asteroidSpeed = 5;
public float rotationspeed = 30;
public int hp = 10;
public float gem = 2;
void Update()
{
transform.Translate(Vector3.left * Time.deltaTime * asteroidSpeed, Space.World);
transform.Rotate(new Vector3(0, 0, Time.deltaTime * rotationspeed));
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
}
EnemyScript에서도 gem 변수를 추가한 후 각각 타입마다 gem의 값을 3, 4로 다르게 적용하였다.
public class EnemyScript : MonoBehaviour
{
public int type = 0;
public int hp = 3;
public float enemySpeed = 4;
public float gem;
void Start()
{
switch (type)
{
case 0:
hp = 10; enemySpeed = 1.5f; gem = 3;
break;
case 1:
hp = 20; enemySpeed = 1.4f; gem = 4;
break;
}
}
void Update()
{
transform.position += Vector3.left * enemySpeed * Time.deltaTime;
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
}
ShootScript에서 gem이 Instantiate될 때 AsteroidSciprt와 EnemyScript에 있는 gem 값을 가져와서 GemScript에 적용한다.
GameObject gemObj = Instantiate(gem, transform.position + randomPosGem, Quaternion.identity);
GemScript gemScript = gemObj.GetComponent<GemScript>();
gemScript.gem = asteroidScript.gem;
void OnTriggerEnter2D(Collider2D collision)
{
print(collision.tag);
if(collision.tag == "Asteroid")
{
AsteroidScript asteroidScript = collision.gameObject.GetComponent<AsteroidScript>();
asteroidScript.hp -= 3;
Instantiate(hitEffect, transform.position, Quaternion.identity);
if(asteroidScript.hp <= 0 )
{
Instantiate(explosion, collision.transform.position, Quaternion.identity);
Vector3 randomPosGem = new Vector3(Random.Range(-0.1f, 0.1f), Random.Range(-0.1f, 0.1f), 0);
GameObject gemObj = Instantiate(gem, transform.position + randomPosGem, Quaternion.identity);
GemScript gemScript = gemObj.GetComponent<GemScript>();
gemScript.gem = asteroidScript.gem;
Destroy(collision.gameObject);
}
Destroy(gameObject);
}
if (collision.tag == "Enemy")
{
EnemyScript enemyScript = collision.gameObject.GetComponent<EnemyScript>();
enemyScript.hp -= 3;
Instantiate(hitEffect, transform.position, Quaternion.identity);
if (enemyScript.hp <= 0)
{
Instantiate(explosion, collision.transform.position, Quaternion.identity);
Vector3 randomPosGem = new Vector3(Random.Range(-0.1f, 0.1f), Random.Range(-0.1f, 0.1f), 0);
GameObject gemObj = Instantiate(gem, transform.position + randomPosGem, Quaternion.identity);
GemScript gemScript = gemObj.GetComponent<GemScript>();
gemScript.gem = enemyScript.gem;
Destroy(collision.gameObject);
}
Destroy(gameObject);
}
}
GameManager에서 젬의 값을 받아서 다 더하기 위해서는 다른 클래스에서 이 GameManager에 instance에 젬을 추가하여 접근할 수 있게 해야한다.
public class GameManager : MonoBehaviour
{
public static GameManager instance;
public List<GameObject> enemies;
public GameObject asteroid;
public float time = 0;
public float spawnTime = 3;
public float spawnSpeed;
public float gem;
void Awake()
{
instance = this;
}
void Start()
{
gem = 0;
}
void Update()
{
spawnSpeed = Random.Range(1.0f, 5.0f);
time += Time.deltaTime * spawnSpeed;
if(time > spawnTime)
{
time = 0;
int check = Random.Range(0, 2);
if(check == 0)
{
Instantiate(asteroid, new Vector3(Random.Range(9.0f, 12.0f), Random.Range(-4.0f, 4.0f), 0), Quaternion.identity);
}
else
{
int type = Random.Range(0, 2);
Instantiate(enemies[type], new Vector3(Random.Range(9.0f, 12.0f), Random.Range(-4.0f, 4.0f), 0), Quaternion.identity);
}
}
}
}
플레이어에서 Rigidbody 2D - [Kinematic], Box Collider 2D - [Is Trigger]을 체크한다.
gem 프리팹에서는 Tag와 Layer가 Item으로 되어있는지를 확인한다.
PlayerScript에는 다음과 같은 내용을 추가한다. "Item" 태그를 가진 콜라이더와 충돌하였을 때, GameManager에 gemScript의 값을 더한 후 프린트하여 확인하고 먹은 젬은 없어지는 기능이다.
void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.tag == "Item")
{
GemScript gemScript = collision.gameObject.GetComponent<GemScript>();
GameManager.instance.gem += gemScript.gem;
print("Gem" + GameManager.instance.gem);
Destroy(collision.gameObject);
}
}
728x90
반응형
'Unity' 카테고리의 다른 글
[Unity] 캔버스(Canvas)와 UI, Text, RectTransform (0) | 2023.09.22 |
---|---|
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(12) 적 미사일 추가, 미사일 충돌 (1) | 2023.09.18 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(10) 적 생성, 충돌, 제거 (0) | 2023.08.31 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(9) 소행성 랜덤 생성기 (0) | 2023.08.31 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(8) 소행성 파괴 이펙트 (0) | 2023.08.31 |