유니티 게임 만들기 1주차(빗물)

joomi·2022년 12월 11일
0

캐릭터 좌우 움직임 주기

rtan 스크립트

float direction = 0.05f;
//direction이라는 변수를 선언

// Start is called before the first frame update
void Start()
{
    
}

// Update is called once per frame
void Update()
{
    transform.position += new Vector3(direction, 0, 0); 
    //direction = 0.05f (위에 정의)
    //0.05는 속력. 숫자가 작아지면 느려지고 커지면 빨라진다.
}

여기까지 하면 캐릭터가 영원히 달려서 화면 밖으로 뛰쳐나감
방향 전환이 필요하다.

캐릭터가 벽에 충돌시 방향 전환

Debug.Log

Debug.Log(transform.position.x);
//console에 x위치 값을 표시

벽에 부딪힐 때 캐릭터의 x값을 알 수 있다.

방향 전환

float direction = 0.05f;
// Start is called before the first frame update
void Start()
{
    
}

// Update is called once per frame
void Update()
{
    if (transform.position.x > 2.8f)
    //만약 캐릭터가 2.8을 넘어갈 경우
    {
        direction = -0.05f;
        //음수 처리로 방향 전환
    }
    if (transform.position.x < -2.8f)
    //만약 캐릭터가 -2.8을 넘어간 경우
    {
        direction = 0.05f;
    }
    transform.position += new Vector3(direction, 0, 0);
}

이미지 좌우반전

float direction = 0.05f;
// Start is called before the first frame update
void Start()
{
    
}

// Update is called once per frame
void Update()
{
    if (transform.position.x > 2.8f)
    {
        direction = -0.05f;
        transform.localScale = new Vector3(-1, 1, 1);
        //x값을 음수처리해서 반전
    }
    if (transform.position.x < -2.8f)
    {
        direction = 0.05f;
        transform.localScale = new Vector3(1, 1, 1);
    }
    transform.position += new Vector3(direction, 0, 0);
}

클릭시 이미지 좌우반전

float direction = 0.05f;
float toward = 1.0f;
// Start is called before the first frame update
void Start()
{
    
}

// Update is called once per frame
void Update()
{
    if (transform.position.x > 2.8f)
    {
        direction = -0.05f;
        toward = -1.0f;
    }
    if (transform.position.x < -2.8f)
    {
        direction = 0.05f;
        toward = 1.0f;
    }
    transform.localScale = new Vector3(toward, 1, 1);
    transform.position += new Vector3(direction, 0, 0);
    if (Input.GetMouseButtonDown(0))
    //만약 버튼을 누르면
	{
    toward *= -1;
    //toward 값에 -1을 곱한다.
    direction *= -1;
    //direction 값에 -1을 곱한다.
	}
}

빗방울

빗방울 떨어지기 세팅

빗방울에 중력 달기

rain에 rigidbody2D를 달고 Gravity Scale 조정

rain이 ground를 지나쳐 화면 밖으로 떨어진다.

땅과 충돌하기

*충돌의 기본조건: 두 대상에 Collider가 있어야 한다 / 둘 중 하나에는 Rigidbody가 있어야 한다.
rain과 ground에 Collider를 달아준다.

rain이 ground에 부딪혀 바닥에 쌓인다.

땅과 충돌했을 때 사라지기

  1. 태그: 땅인지 알 수 있게 ground 태그 달기
  2. Debug.Log 함수를 통해 ground와 충돌하는 시점 알기
void OnCollisionEnter2D(Collision2D coll)
//다른 콜라이드에 부딪혔을 때 실행되는 함수
{
    if (coll.gameObject.tag == "ground")
    //만약 ground 태그가 달린 게임오브젝트에 부딪혔다면
    {
        Debug.Log("땅이다!");
    }
}
  1. 빗방울이 없어지게 하기
void OnCollisionEnter2D(Collision2D coll)
{
    if (coll.gameObject.tag == "ground")
    //만약 ground 태그가 달린 게임오브젝트에 부딪혔다면
    {
        Destroy(gameObject);
        //gameObject(나 자신)을 사라지게 한다.
    }
}

빗방울 랜덤 발생

랜덤 위치

start() 함수에 랜덤 position 세팅하기

void Start()
{
    float x = Random.Range(-2.7f, 2.7f);
    //화면 밖을 벗어나지 않도록 범위를 잡아준다.
    float y = Random.Range(3.0f, 5.0f);
    transform.position = new Vector3(x, y, 0);
}

랜덤 사이즈

int type;
//type 선언
float size;
int score;
//score 선언

// Start is called before the first frame update
void Start()
{
    float x = Random.Range(-2.7f, 2.7f);
    float y = Random.Range(3.0f, 5.0f);
    transform.position = new Vector3(x, y, 0);

    type = Random.Range(1, 4);
    //1~3사이의 타입이 랜덤으로 존재한다.

    if (type == 1)
    //1번 타입이라면
    {
        size = 1.2f;
        score = 3;
        //점수 3
        GetComponent<SpriteRenderer>().color = new Color(100 / 255f, 100 / 255f, 255 / 255f, 255 / 255f);
        //랜덤 컬러 부여
    }
    else if (type == 2)
    {
        size = 1.0f;
        score = 2;
        GetComponent<SpriteRenderer>().color = new Color(130 / 255f, 130 / 255f, 255 / 255f, 255 / 255f);
    }
    else
    {
        size = 0.8f;
        score = 1;
        GetComponent<SpriteRenderer>().color = new Color(150 / 255f, 150 / 255f, 255 / 255f, 255 / 255f);
    }

    transform.localScale = new Vector3(size, size, 0);
}

빗방울이 계속 나오게 하기

1. GameManager 만들기

GameManager: 게임 전체를 조율하는 오브젝트
Object-EmptyObject / C#스크립트도 GameManager 생성(아이콘이 다르다)

2. 빗방울 복제하기: Prefabs

Assets 폴더에 Prefabs 폴도 생성 후 rain 오브젝트 끌어오기
이후 MainScene의 rain 오브젝트는 삭제한다.

public class GameManager : MonoBehaviour
{
    public GameObject Rain;
    //Rain이라는 게임오브젝트를 정의

이후 GameManager 오브젝트-GameManager Script 하단 Rain에 rain 오브젝트를 넣어준다.

void Start()
{
    InvokeRepeating("makeRain", 0, 0.5f);
    //makeRain이라는 함수를 0.5초마다 발생시킨다.
}

void makeRain()
//makeRain 함수 정의
{
    //Debug.Log("비를 내려라!");
    Instantiate(Rain);
    //Rain Prefabs를 복제한다.
}

점수 부여하기

점수 보드 만들기

MainScene-Create-UI-Canvas 생성, 하위에 UI-Text 생성

GameManager: 싱글톤화 (잘 모르겠음 아직 걍 해)

public static gameManager I;

void Awake()
{
    I = this;
}

점수 올리는 함수

int totalScore = 0;
//0으로 시작
public void addScore(int score)
{
    totalScore += score;
}
void OnCollisionEnter2D(Collision2D coll)
{
    if (coll.gameObject.tag == "ground")
    {
        Destroy(gameObject);
    }

    if (coll.gameObject.tag == "rtan")
    {
        gameManager.I.addScore(score);
        Destroy(gameObject);
    }
}

점수 표기

using UnityEngine;
using UnityEngine.UI;
////UI Text 받기

public class GameManager : MonoBehaviour
{
    public GameObject Rain;
    //Rain이라는 게임오브젝트를 정의
    public static GameManager I;
    public Text scoreText;
    public Text timeText;
    public GameObject Pannel;
    int TotalScore = 0;
    

    void Awake()
    {
        I = this;
    }
    // Start is called before the first frame update
    void Start()
    {
        InvokeRepeating("makeRain", 0, 0.5f);
    }
    
    // Update is called once per frame
    void Update()
    {
    }
    void makeRain()
    {
        Instantiate(Rain);
    }
    public void addScore(int score)
    {
        TotalScore += score;
        scoreText.text = TotalScore.ToString();
        //Text 내용 바꿔주기
    }
 }
profile
짜잔...

0개의 댓글