=========================================================
미니게임 - 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 (0) | 2019.06.18 |
0617 유니티 기초 (0) | 2019.06.17 |