2023/07/18 TIL

김도현·2023년 7월 18일
0

TIL

목록 보기
1/76

TIL의 첫 시작!!

금일 공부 한 것
C# 사전 문법 기초 (Unity 사전캠프) - 연습문제 1~7
[스파르타코딩클럽] 게임개발 종합반 - 1주차
-> 간단한 모바일 게임/르탄으로 빗물 받는 게임(?) 제작

알게 된 점
1. Unity로 c#스크립트로 생성시 기본으로 짜여진 모습

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//using은 XXXX.XXXX();같은 형태로 호출해야 되는 것을 미리 선언해둠으로써 생략가능
public class rtan : MonoBehaviour //C# 스크립트 이름 = rtan
{
    
    // Start is called before the first frame update
    void Start() //위에 적힌 주석처럼 처음 시작시 호출됨 -> 처음만 호출하는거 적어주면 됨
    {

    }

    // Update is called once per frame
    void Update() //프레임당 한 번 호출 -> 계속 바뀌는 상태를 적어주면 됨
    {
        
    }
}
  1. 캐릭터(rtan)
public class rtan : MonoBehaviour
{
    float direction = 0.05f;  	//=> 1프레임당 이동되는 값을 넣은 변수
    float toward = 1.0f; 		//=> 이미지를 반전시키는 값을 넣은 변수
    void Start(){}

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) //그말 그대로 마우스의 버튼이 눌리면 = true
        {
            toward *= -1;  		//*-1을 곱하여 조건에 맞게 반전
            direction *= -1;	//*-1을 곱하여 조건에 맞게 반전
        }
        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);
        //크기를 기본 1과 동일한 값이지만 부호가 반대여서 반전을 구현
        transform.position += new Vector3(direction, 0, 0);
  //position -> 위치 변경 , localScale -> 크기 변경 Vector3 -> z,y,z축으로 변경
    }
}

반전에 관한 참조자료
Daek_You님의 블로그 - [Unity] 2D 게임 오브젝트가 바라보는 방향 전환하기
3. 빗방울(rain)

public class rain : MonoBehaviour
{
    int type; //비의 타입을 저장하는 변수
    float size; //비의 사이즈
    int score;  //점수
    void Start()
    {
        float x = UnityEngine.Random.Range(-2.7f, 2.7f); //비를 랜덤한 위치생성(x축)
        float y = UnityEngine.Random.Range(3.0f, 5.0f); //비를 랜덤한 위치생성(y축)
        transform.position = new Vector3(x, y, 0);
        type = UnityEngine.Random.Range(1, 5); //1~4의 값을 랜덤으로 저장

        if(type == 1)
        {
            size = 1.2f;
            score = 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 if(type==3)
        {
            size = 0.8f;
            score = 1;
            GetComponent<SpriteRenderer>().color = new Color(150 / 255f, 150 / 255f, 255 / 255f, 255 / 255f);
        }
        else
        {
            size = 0.8f;
            score = -5;
            GetComponent<SpriteRenderer>().color = new Color(255 / 255f, 100 / 255f, 255 / 255f, 255 / 255f);
        }
        transform.localScale = new Vector3(size, size, 0);
    }

    void Update()
    {
        
    }
    void OnCollisionEnter2D(Collision2D coll) //현재 오브젝트 콜라이더와 다른 오브젝트의 콜라이더와 접촉시 호출
    {
        if (coll.gameObject.tag == "ground") //충돌한 오브젝트 태그가 "ground"일시 True
        {
            Destroy(gameObject); //오브젝트 삭제(빗방울)
        }
        if (coll.gameObject.tag == "rtan")
        {
            Destroy(gameObject);
            GameManager.I.addScore(score); // 게임매니저에 있는 addScore를 호출
        }
    }
    
}

OnCollisionEnter2D() 메서드에 관한 참조자료
Han님의 블로그 - 유니티2D #19 유니티 OnCollisionEnter2D , OnCollisionExit2D
4. 패널(panel)

public void retry()
{
	GameManager.I.retry(); //패널을 누를시 GameManager의 retry를 호출하여 게임 초기화
}
  1. 게임매니저(GameManager)
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    public GameObject rain;
    public GameObject panel;
    public static GameManager I;
    public Text scoreText;
    public Text timeText;

    int totalScore;
    float limit = 5; //제한시간 초기값

    private void Awake()
    {
        I = this; //싱글톤화 자기자신을 참조하여 중복생성 방지
    }

    void Start()
    {
        initGame(); //텍스트 및 점수, 시간값을 초기화
        InvokeRepeating("makeRain", 0, 0.5f); //처음시작 시간 0초 0.5초마다 반복하여 makeRain을 호출
    }
    void makeRain()
    {
        Instantiate(rain);//"rain"이라는 게임 오브젝트를 인스턴스화
    }
    void Update()
    {
        limit -= Time.deltaTime; //프레임이 완료되기까지 걸린 시간.
        if (limit < 0) //제한시간이 0초가 되면
        {
            Time.timeScale = 0.0f; //시간 정지
            panel.SetActive(true); //패널 가시화
            limit = 0.0f;
        }
        timeText.text = limit.ToString("N2"); // limit값을 텍스트에 표현, N2 : 소수점 2자리까지 표현
    }
    
    public void addScore(int score)
    {
        totalScore += score; 
        scoreText.text = totalScore.ToString();
    }
    public void retry()
    {
        SceneManager.LoadScene("MainScene");//스크린 화면을 "MainScene"로 이동
    }

    void initGame()
    {
        Time.timeScale = 1.0f;
        totalScore = 0;
        limit = 30.0f;
    }
}

Time.deltaTime에 관한 참고 자료
베르의 프로그래밍 노트 블로그의 - [Unity] Time.deltaTime
싱글톤 패턴에 관한 참조 자료
C#-디자인 패턴-싱글톤 패턴
this에 관한 참조 자료
자유로운영혼의 블로그 - [C# 기초]this키워드, this()생성자 개념

느낀 점
Unity는 툴이 잘 되어있어 드로그앤 드롭으로 손쉽게 제작할 수 있다.
아직 모르는 것이 많아서 정리하는데 오래걸렸다...

그리고 나와 같은 수업(?)을 듣는사람의 선배를 찾았다.
https://velog.io/@notmyfirst/unity-study-1

0개의 댓글