피곤핑
코딩일탈
피곤핑
전체 방문자
오늘
어제
  • 분류 전체보기
    • Kotlin & Java
    • Spring
      • Spring Security
      • Spring
    • 네트워크
    • JavaScript & Node js
    • Docker
    • Python3
    • Unity
    • 딥러닝
    • 객체지향프로그래밍
    • Error 보고서
    • 나의 이야기 & 회고
    • HTML & CSS
    • Archive
    • 독서

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 99클럽
  • 항해99
  • 오블완
  • 코딩테스트준비
  • 개발자취업
  • TiL
  • JavaScript
  • nodejs
  • 티스토리챌린지
  • Client

최근 댓글

hELLO · Designed By 정상우.
피곤핑

코딩일탈

0618 Flappy Bird (Mini Game)
Unity

0618 Flappy Bird (Mini Game)

2019. 6. 18. 21:17

========================================================= 
미니게임 - Flappy Bird (베트남개발자 앱스토어에 있다가 내림) 
프로젝트안에 Library는 지워도 되는데 다시킬 때 시간이 많아짐  
1. 큐브만들기. (기본 게임오브젝트 (카메라1개 , 디렉션라이트1개) 
 - 게임오브젝트란? default는 (위치정보:transform), 플레이어, 적, 나무나 돌 가능. 
2. 큐브 이름을 Player로 변경. 
3. 포지션 x=0, y=0, z=0 설정. (transform component: 이동, 회전, 확대축소에 관여.) 
 - 원래 Player는 루트에 있음  
4. 실행해보기. (달라지는건 사실 없음.) 
5. 카메라 위치 이동 x=0, y=0, z=-10. 
6. 화면비율설정 - Game 뷰 > Free Aspect > 16:9 변경 
7. Direction Light (0 10 0, 50 -30 0, 1 1 1) 설정. 
 - 태양빛을 단순화한 광원. 게임오브젝트가 어디에 있든 일정한 각도와 세기. 비용 저렴. 
8. 다가오는 윗벽 만들기 
 -> 큐브 추가 (0 7.5 0, 0 0 0, 2 10 2) 
 8-1. 윗벽 복사하기  
  - Eit > Duplicate > 큐브 복사 (-7.5로 설정) 
9. 빈 게임 오브젝트 만들기 - creat empty > 이름 : Wall (0 0 0, 0 0 0, 1 1 1) 
10. 큐브 두개를 Wall 의 자식으로 넣음. (Wall 을 움직임으로써 큐브두개를 같이 움직일 수 있음.) 
11. (Position) Player x = -5, Wall x=5 
12. Player에게 Rigidbody 추가. (메뉴 > Component > Physics > Rigidbody 가능) 
 - Rigidbody(강체) : 외부에 힘을 받아도 크기와 모양이 변하지 않는 고체를 강체라고. 
13. Scene 저장. 이름 : Main 
 - 일반적으로 Scene을 나누는 조건은 화면 전환이 일어나는 시점. 
   -> 로비, 인게임으로 구성된 게임이면 1개의 Project에 2개의 Scene으로 구성. 
14. Assets에 Scripts 폴더 생성 
15. MyPlayer 라는 C# 스트립트 생성 
16. 점프하도록 스크립트 수정. ->밑에 바로 복붙하면 되용 추가된게 굵은글씨. 
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class MyPlayer : MonoBehaviour 
{ 

    //다른 클래스에서 이 필드변수를 볼 수 있음 + (유니티에서는) 
    public float jumpPower; 

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

    // Update is called once per frame 
    void Update() 
    { 
        if (Input.GetButtonDown("Jump")) //스페이스를 누르면 true로 1값이 들어감. 
        { 
            //velocity에 값을 넣으면 이동함 -> 물리에 적용을 받는 이동. (ex. 자동차 레이싱게임) 
            GetComponent().velocity = new Vector3(0, jumpPower, 0); 
        }     
    } 
} 

  Input.GetButtonDown - 유니티 내장 클래스,함수  
 -> 점프라는 버튼이 down 됐을 때 ture가 되서 액션 발동. 
  edit > project Settings > input > axes > 정보 있음. 
Rigidbody myRigidbody; 하고 밑에 Start함수나 다른곳에서 
myRigidbody = GetComponent(); 선언 해 줄 수 도 있음. 
update문에서 if(myRigidbody != null)  ~ 이런식으로도 사용 가능. 
17. myPlayer 스크립트 -> Player 에 연동. 
18. Player > Inspector > Jump Power : 5로 변경. (m단위) 

19. 벽 이동시키기 -> 스크립트파일 만들기 (myWall.cs) 
// 초당 5m 가고싶으면 speed에 5를 집어넣으면 됨. 
  transform.Translate(speed * Time.deltaTime, 0, 0); //x,y,z 값 (y -> up) 
update 틱이라고하는데 이게 고정된 값이 아님. 
 - Time.deltaTime = 고정된 속도로 가기위함. 습관처럼 무조건 넣어야함. 
 -> 한 tick에 걸린 시간을 나타내는 미리 정의된 변수 (float형으로 1.0은 1초) 
ex) 초당 5m가고 싶으면 
 (5 * 0.5) + (5 * 1.5) = 2.5 + 7.5 = 10.0 

20. 스크립트와 오브젝트 연결시키고 speed = -5 
              -> 플레이어보다 벽이 앞에 있기때문에 뒤로 가도록 만들기 위해

21.  (플레이어와 벽이 충돌했을 때 실행 될 처리 만들기) - 리셋
    private void OnCollisionEnter(Collision collision)
    {
        SceneManager.LoadScene("Main");
    }
  : 어떤 신이든 상관없이 특정 씬을 load 하기 위함.
 - 보통 충돌함수는 3개가 있음 (딱 1번, 루프돌며 호출되는함수, ~~~?)
22. 벽 프리팹 만들기
 Assets > Prefabs 폴더만들기
 Wall 오브젝트 드래그 앤 드롭 > Prefabs 폴더로 옮김
-> 파랗게 활성화가 되면 프리팹 완성.
 - 프리팹이란? GameObject를 만드는 틀(원형)이라고 생각하면 이해하기 쉬움.
 - 설정 값이 공유되기 때문에 한꺼번에 수정하기 용이, 메모리절약.
23. Hierarchy 에있는 Wall 오브젝트 삭제.
24. (스포너만들기) (0 0 0, 0 0 0, 1 1 1) 세팅
 Hierarchy 창에 create empty > "Spawner" 만들기
25. "MySpawner" C# 스크립트 만들기.
26. (1초에 한번씩 벽 생성위한 코드)
    //Wall 오브젝트
    public GameObject wallPrefab;
    //스폰 간격
    public float interval;
    void Start()
    {
        StartCoroutine(SpawnWall()); //초기화를 위한 코드
       //씨샵 기본적인 문법임. 로직이 간편하고 보기 편함.
    }

    IEnumerator SpawnWall()
    {
        while (true)
        {
            //GameObject나 프리팹의 복사본을 만드는 함수
            Instantiate(wallPrefab, transform.position, transform.rotation);
            // interval 이후에 while에 의해 Instantialte() 호출
            yield return new WaitForSeconds(interval); 
        }
    }  -> 멀티쓰레드는 아님. 약간의 꼼수. 그대로 순차처리 맞음.
(*) 베타버전에 잡시스템, CS라고 있는데 이걸로는 병렬처리가 가능함.
 ex) 만 개의 캐릭터가 있는데, 그냥 유니티 코드로 만들었다면 초당 7프레임정도 
나오는데 잡시스템이나 CS로 바꾼다면 70프레임이 나옴 (10배 이상)
보통 게임은 최소 24프레임정도가 되어야함. 이 이하로 떨어진다면 버벅거리게 됨.
ex) yield return new Wait~~
      yield return null;
      yield break;
27. MySpawner > Spawner에 연동.
28. 프리팹 지정하기
 Spawner > Inspector > Wall prefab에 wall prefab 연동
29. interval : 1.5
30. Spawner > position (13, 0, 0)
 -> 왜 13으로 바꾸는가? 1초후에 생성되는 x위치가 13
(*) 객체를 생성시키는지, 소멸시키는지 이런 코드가 중요함
31. (게임오브젝트 위치랜덤하게하기)
    public float range = 3.0f; //실수형이기 때문에 디테일하게 움직일 수 있음.
 - while문안에 
    Vector3 vNewPos = new Vector3(transform.position.x, Random.Range(-range, range), transform.position.z);
   (+ Instantialte에 y좌표 vNewPos로 바꾸기)

 - Vector3? 구조체 = 즉, 클래스 (x, y, z 값을 가지고 있음.) - 3D좌표에서 많이 씀. (RGB)
 - Random.Range(-range, range) : -3 ~ 2.999999 (절대 max값을 만들지 않음)
32. (불필요한 게임 오브젝트 삭제하기 )
게임을 진행하면 "Wall" 오브젝트가 하이라키에 게속쌓임 -> 메모리누수의 원인.
33. MyWall 스크립트에 Start() 함수안에
   Destroy(gameObject, 10.0f); ->해결 - 10초에 사라짐
   gameObject = Wall (연결된 자식들도 한꺼번에 지워짐을 알 수 있음.)
34. 벽이 생성되는 시간을 다르게 만들어보자!!!
yield return new WaitForSeconds(Random.Range(0.5f, 3.0f));
35. (화면에 이동거리 표시하기)
하이라키 > 마우스 우클릭 > UI > Text
36. text > Inspector > 설정 리셋
37. Inpector창에 뭔 네모난거 누르면 anchor 어쩌구 있는데 top에 가운데꺼 클릭.
  유저페이지를 계속 띄워놓는 것. (해상도 때문에 위치 유지 시키기 위함)
38. y : -27
39. Inpector > Character 에서 임의대로 설정
40. MyPlayer.cs 코드 추가
    using UnityEngine.UI; 

    public Text _textDistance;
    private float _fDisstance = 0.0f;
41. update() 에 코드추가
       _fDistance += Time.deltaTime; //틱(update)이 얼마만에 들어왔는지 계속 누적.
        _textDistance.text = _fDistance.ToString("0.0") + "m";
       // 숫자를 문자로 바꾸어줌. 소수점 첫째짜리까지만 나오게
42. Plyer > Inspector > none(text) 에 text 오브젝트 드래그앤 드롭
43. MyPlayer.cs 
    public MyWall _myWall;
    _fDistance += Time.deltaTime * Mathf.Abs(_myWall._speed);
  - Mathf : 유니티에서 연산관련 함수, Abs : 절대값 리턴
 - 스피드가 1이면 초당 1m간다는 소리.
44. Player > Inspector > MyWall 에 prefab Wall 드래그앤드롭

'Unity' 카테고리의 다른 글

0620 GyroBall 2  (0) 2019.06.20
0619 GyroBall  (0) 2019.06.19
0619 Flappy Bird  (0) 2019.06.19
0618 유니티기초2  (1) 2019.06.18
0617 유니티 기초  (0) 2019.06.17
    'Unity' 카테고리의 다른 글
    • 0619 GyroBall
    • 0619 Flappy Bird
    • 0618 유니티기초2
    • 0617 유니티 기초
    피곤핑
    피곤핑

    티스토리툴바