STIKA
내일배움캠프 Unity 5일차 TIL - 3주차 본문
23.12.28 Thu
❤️ TIL
Today I Learned
❤️하루에 1%씩만 나아가도 4개월 동안 쌓이면 꽤 덩치가 커진답니다 :)
📌 오늘의 계획
- 3주차 강의 끝내기
✏️ 작업 내용
메인 카메라 바꾸는 방법
FFF0B2 Background 색이 바뀜
Size 5 → 25
(조금 더 멀리서 보겠다는 의미)
StartScene 만들기
어떤 동작으로 MainScene으로 넘어가게 만들기
public void GameStart()
{
SceneManager.LoadScene("MainScene");
}
StartScene → UI → image → image 입히기 → button component 만들기 → script 만들기 → button 과 script 연결
Game Start 함수 만들기
button의 onClick에 button드래그, script의 GameStart함수 연결
Food 만들 때 sprite에 우클릭해서 knob으로 바꿔주기
public GameObject square;
void Start()
{
InvokeRepeating("makeSquare", 0.0f, 0.5f);
}
void makeSquare()
{
Instantiate(square);
}
Instantiate() 프리팹을 복제하기
InvokeRepeating("makeSquare", 0.0f, 0.5f)
→ makeSquare함수를 0.5초마다 호출
Instantiate(food, new Vector3(x,y,0), Quaternion.identity);
지금은 그냥 복제가 아니라 위치를 받고 그 위치에서 복제해야함
Instantiate에 복제할 prefabs, 좌표, 회전을 넣어야함
(Vector3는 3차원상의 좌표를 넣어야해서)
Quaternion.identity 는 회전 없다는 뜻
food.cs
float direction = 0.05f;
void Update()
{
// 이후 코드들은 다시 Update로!
}
void FixedUpdate()
{
transform.position += new Vector3(0, direction, 0);
}
매 업데이트마다 y축이 0.5씩위로올라가게
transform의 속도가 너무 빨라서 fixedUpdate를 쓰기로함
void Update()
{
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.position = new Vector3(mousePos.x, transform.position.y, 0);
}
마우스 받아오기
x좌표만
y좌표는 object의 현재위치
void Update()
{
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
float x = mousePos.x;
if(x > 9.0f)
{
x = 9.0f;
}
if(x < -9.0f)
{
x = -9.0f;
}
transform.position = new Vector3(x, transform.position.y, 0);
}
지정 범위 밖으로 안나가게 하기
UI → canvas → worldspace
UI 세상에 있는걸 게임 세상으로 가지고옴
hp바의 배경을 깔고 실제 hp는 하나 더 만듬
pivot이 0.5가 기본값인데 scale에 따라 가운데부터 늘어나고 줄어듬
이걸 0으로 바꿔서 제일 왼쪽부터 늘어나고 줄어들게 만들기
📌 고양이 그림 Animation 오류 nomalCat(emty)말고 hungry(square)에 넣으니 해결
충돌을 위해 collider와 rigidbody를 걸었는데 rigidbody가 거꾸로 가려면 kinematic으로 바꿔야하고
대신 충돌을 감지를 못해서 중력의 영향을 안 받을 때에는 Is Trigger을 체크해줘야한다
Kinematic = 중력의 영향을 안 받겠다는 뜻
Is Trigger = 충돌 감지는 되지만, 물리적인 충돌은 발생하지 않는 옵션이다.
void OnTriggerEnter2D(Collider2D coll)
{
if (coll.gameObject.tag == "food")
{
energy += 1.0f;
Destroy(coll.gameObject);
}
}
📌 오류가 한번 났었는데 Is Trigger을 체크해서 그런지 OnCollision이 아니라 OnTrigger함수를 씀
void OnTriggerEnter2D(Collider2D coll)
{
if (coll.gameObject.tag == "food")
{
if (energy < full)
{
energy += 1.0f;
Destroy(coll.gameObject);
gameObject.transform.Find("hungry/hp/front").transform.localScale
= new Vector3(energy / full, 1.0f, 1.0f);
}
else
{
gameObject.transform.Find("hungry").gameObject.SetActive(false);
gameObject.transform.Find("full").gameObject.SetActive(true);
}
}
}
normalCat이 상위
하위에 hungry, hp, front, back이 있는건데
이런경우 이걸 find함수로 찾을수있음
private void FixedUpdate()
{
if (energy < full)
{
transform.position += new Vector3(0, direction, 0);
}
else
{
if (transform.position.x > 0)
{
transform.position += new Vector3(0.05f, 0, 0);
}
else
{
transform.position += new Vector3(-0.05f, 0, 0);
}
Destroy(gameObject, 3.0f);
}
}
에너지가 다 차면 가까운쪽으로 이동하는 함수인데
속도가 조절이 안되서 fixed에 넣음
gameManager.I.addCat();
고양이가 배부를 때 addCat() 함수 부르기
하지만 이것만 추가하면 안됨
옆으로 빠지는 도중에 food에 맞으면 addCat이 계속 호출되는 버그
bool isFull = false;
if (isFull == false)
{
gameManager.I.addCat();
gameObject.transform.Find("hungry").gameObject.SetActive(false);
gameObject.transform.Find("full").gameObject.SetActive(true);
isFull = true;
}
isFull 이라는 상태를 알 수 있는 함수를 만들고 제어한다
public void AddCat()
{
cat += 1;
level = cat / 5;
levelText.text = level.ToString();
levelFront.transform.localScale
= new Vector3((cat - level * 5) / 5.0f, 1.0f, 1.0f);
}
정수 / 정수는 무조건 정수로 나와야해서 0.8이런값은 0으로 취급됨
front바의 비율을 정하기
현재 레벨에서 잡은 고양이 수
void MakeCat()
{
Instantiate(normalCat);
//난이도조절
if (level == 1)
{
float p = Random.Range(0, 10);
if (p < 2)
Instantiate(normalCat);
}
else if (level >= 2)
{
float p = Random.Range(0, 10);
if (p < 5)
Instantiate(normalCat);
}
}
확률형 난이도 조절
public int type;
cat.cs에 고양이 타입 만들기
normal과 fat에 type이 생김 거기에 숫자 바꿔주기
void Start()
{
float x = Random.Range(-8.5f, 8.5f);
float y = 30.0f;
transform.position = new Vector3(x, y, 0);
if (type == 1)
{
full = 10.0f;
}
}
타입별로 속성도 다르게 설정
if (energy < full)
{
if (type == 0)
{
transform.position += new Vector3(0.0f, -0.05f, 0.0f);
}
else if (type == 1)
{
transform.position += new Vector3(0.0f, -0.03f, 0.0f);
}
if (transform.position.y < -16.0f)
{
gameManager.I.gameOver();
}
}
타입별 속성 바꾸기
void makeCat()
{
Instantiate(normalCat);
if (level == 1)
{
float p = Random.Range(0, 10);
if (p < 2) Instantiate(normalCat);
}
else if (level == 2)
{
float p = Random.Range(0, 10);
if (p < 5) Instantiate(normalCat);
}
else if (level >= 3)
{
float p = Random.Range(0, 10);
if (p < 6) Instantiate(normalCat);
Instantiate(fatCat);
}
}
레벨에 따라 소환되는 고양이 조절
📝 오늘의 마무리
3주차 강의를 끝내는데에 성공했다.이미지 소스를 받아와서 만드니 확실히 별거 안만져도 퀄리티가 좋아지는 느낌서서히 조금 이해가 더 필요한 부분이 늘어서 점점 어려워지는 걸 느끼는 중이다.이거랑 비슷한 예제 한 10개 정도만 만들면 완전 이해 가능할 것 같은 느낌이다
✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기
✏️ TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기
✏️ 꾸준히 기록을 남기는 습관 가지기
📕 오늘의 학습 키워드
📕 공부한 내용 본인의 언어로 정리하기
📕 오늘의 회고
📕 12시간 중 얼마나 몰입했는지
📕 더 나은 미래를 위해 내일 어떤 공부를 진행할 것인지
'프로그래밍 > Unity + C#' 카테고리의 다른 글
내일배움캠프 Unity 7일차 TIL - C# 문법 1 (1) | 2024.01.02 |
---|---|
내일배움캠프 Unity 6일차 TIL - C# 문법 시작 (0) | 2023.12.29 |
내일배움캠프 Unity 4일차 TIL - 2주차 (0) | 2023.12.28 |
내일배움캠프 Unity 3일차 TIL - 1, 2주차 함수 (0) | 2023.12.26 |
내일배움캠프 Unity 2일차 TIL - 1주차 (0) | 2023.12.22 |