[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(11) 젬 점수, 젬 먹기

2023. 9. 18. 16:42Unity

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
반응형