본문 바로가기
공부/Unity 기초

2D 슈팅 - 9 / 누적점수에 따른 속도변경

by svcbn 2022. 5. 17.

적이 플레이어의 총알에 닿아서 격추될 때마다 점수를 1점씩 획득하도록 한다.

플레이어의 현재 점수가 10의 배수가 될 때마다 배경 스크롤 속도를 20%씩 증가시킨다.

 

 

먼저 Background에서 스크롤 속도를 증가시키는 함수 ScrollSpeedUp 을 생성한다.

public void ScrollSpeedUp(float increaseRate)
    {
        // 백분율로 입력받은 매개변수의 값을 실제 적용값으로 환산한다.
        float rate = increaseRate * 0.01f;

        // 기본 스크롤 속도에 반영
        finalSpeed += speed * rate;
    }

 

 

BackGround 전문

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// y방향으로 스크롤 하고싶다
public class Background : MonoBehaviour
{
    public float speed = 0.1f;
    // MeshRederer > Material > OffsetY

    public float finalSpeed = 0;

    Material mat;

    // Start is called before the first frame update
    void Start()
    {
        // 태어날때 MeshRenderer를 가져와서
        MeshRenderer renderer = GetComponent<MeshRenderer>();

        // 그안에 있는 Material을 기억하고싶다.
        mat = renderer.material;

        finalSpeed = speed;
    }

    // Update is called once per frame
    void Update()
    {
        // 살아가면서 Material의 OffsetY값을 증가시키고 싶다.
        // mat.mainTextureOffset += Vector2.up * speed * Time.deltaTime;
        mat.mainTextureOffset += Vector2.up * finalSpeed * Time.deltaTime;
    }

    public void ScrollSpeedUp(float increaseRate)
    {
        // 백분율로 입력받은 매개변수의 값을 실제 적용값으로 환산한다.
        float rate = increaseRate * 0.01f;

        // 기본 스크롤 속도에 반영
        finalSpeed += speed * rate;
    }
}

 

 

 

PlayerMove에서 score 변수를 선언하고

10의 배수가 될 때마다 Background의 ScrollSpeedUp을 호출한다.

// score 값이 10의 배수가 될 때마다 bg에 있는 ScrollSpeedUp 함수 호출
        if (score % 10 == 0 && score > checkPoint)
        {
            bg.ScrollSpeedUp(20.0f);
            checkPoint = score;
        }

 

 

점수 누적을 위해 PlayerMove에서 AddScore 함수를 생성한다.

// 점수 획득을 위한 함수
    public void AddScore(int point)
    {
        // 매개변수 point를 통해서 받은 값을 score 변수에 누적시킨다.
        score += point;
    }

 

 

PlayerMove 전문

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    public float speed = 5;
    public float finalSpeed = 0;

    // 현재 점수
    public int score = 0;

    // Background 클래스 호출
    public Background bg;

    int checkPoint = 0;

    
    // Start is called before the first frame update
    void Start()
    {
        finalSpeed = speed;
    }

    // Update is called once per frame
    void Update()
    {
        // 사용자의 입력에 따라
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        // 방향을 만들고
        Vector3 dir = Vector3.right * h + Vector3.up * v;
        // right : [0,0,0] [1,0,0] [-1,0,0]
        // up    : [0,0,0] [0,1,0] [0,-1,0]

        // 대각선 이동시 움직임의 크기가 더 크다
        // 벡터를 정규화 하고싶다.
        dir.Normalize();


        // 만일, 키보드의 왼쪽 Shift 키를 눌렀다면
        if(Input.GetKeyDown(KeyCode.LeftShift))
        {
            // speed 변수의 값을 2배로 늘린다.
            finalSpeed = speed * 2;
        }

        // 그렇지 않고 만일, 키보드의 왼쪽 Shift 키를 뗏다면
        else if(Input.GetKeyUp(KeyCode.LeftShift))
        {
            // speed 변수의 값을 원래대로 돌려 놓는다.
            finalSpeed = speed;
        }


        // 플레이어를 이동하고싶다.
        // 이동공식 P = P0 + vt
        transform.position += dir * finalSpeed * Time.deltaTime;


        // score 값이 10의 배수가 될 때마다 bg에 있는 ScrollSpeedUp 함수 호출
        if (score % 10 == 0 && score > checkPoint)
        {
            bg.ScrollSpeedUp(20.0f);
            checkPoint = score;
        }
    }

    // 점수 획득을 위한 함수
    public void AddScore(int point)
    {
        // 매개변수 point를 통해서 받은 값을 score 변수에 누적시킨다.
        score += point;
    }
}

 

 

 

Enemy에서 Bullet과 충돌시

Player 오브젝트의 PlayerMove 클래스의 AddScore 함수 호출한다.

// 만일, 충돌한 대상이 총알이라면
        if(other.gameObject.name.Contains("Bullet"))
        {
            // 플레이어(target) 오브젝트의 PlayerMove 클래스의 AddScore 함수 호출
            PlayerMove player = target.GetComponent<PlayerMove>();
            player.AddScore(1);
        }

 

 

Enemy 전문

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 태어날 때 30% 확률로 플레이어 방향, 나머지 확률로 아래방향으로 정하고
// 살아가면서 그 방향으로 계속 이동하고싶다.
public class Enemy : MonoBehaviour
{
    // 방향
    Vector3 dir;

    // 속력
    public float speed = 5;

    public GameObject explosionFactory;

    GameObject target;


    // Start is called before the first frame update
    void Start()
    {
        // 태어날 때

        // 플레이어를 찾는다.
        target = GameObject.Find("Player");


        // 30 % 확률로 플레이어 방향, 나머지 확률로 아래방향으로 정하고
        int result = UnityEngine.Random.Range(0, 10);
        if (result < 3)
        {
            // dir = target - me
            dir = target.transform.position - transform.position;
            dir.Normalize();
        }
        
        else
        {
            // 아래방향
            dir = Vector3.down;
        }
    }

    // Update is called once per frame
    void Update()
    {
        // 살아가면서 그 방향으로 계속 이동하고싶다.
        transform.position += dir * speed * Time.deltaTime;
    }

    
    private void OnCollisionEnter(Collision other)
    {
        // 시각효과 공장에서 시각효과를 만들어서
        GameObject explosion = Instantiate(explosionFactory);

        // 내 위치에 가져다 놓고싶다.
        explosion.transform.position = transform.position;

       
        // 만일, 충돌한 대상이 총알이라면
        if(other.gameObject.name.Contains("Bullet"))
        {
            // 플레이어(target) 오브젝트의 PlayerMove 클래스의 AddScore 함수 호출
            PlayerMove player = target.GetComponent<PlayerMove>();
            player.AddScore(1);
        }

          


        // 충돌시 플레이어, 총알 파괴
        Destroy(other.gameObject);

        // 충돌시 에너미 파괴
        Destroy(gameObject);

        

    }
}

'공부 > Unity 기초' 카테고리의 다른 글

3D FPS - 2 / 시점 변화  (0) 2022.05.17
3D FPS - 1 / 이동과 회전, 점프  (0) 2022.05.17
2D 슈팅 - 8 / 함정 추가  (0) 2022.05.16
2D 슈팅 - 7 / 총알 추가  (0) 2022.05.16
2D 슈팅 - 6 / 이동속도 증감  (0) 2022.05.16