1. ObjectHit 스크립트에서 태그로 충돌을 검사하여 Player일 때 색을 변경하고 자신의 Tag를 Hit으로 변경하기
2. Scorer 스크립트에서 태그로 충돌을 검사하여 Hit인지 검사하고 Hit이 아니면 점수를 올리기
ObjectHit.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectHit : MonoBehaviour
{
private void OnCollisionEnter(Collision collision)
{
// 충돌한 객체의 게임 오브젝트의 태그가 Player이면
if (collision.gameObject.tag == "Player")
{
GetComponent<MeshRenderer>().material.color = new Color(1, 0, 0, 1); // red
// ObjectHit이 있는 해당 오브젝트의 tag를 Hit으로 변경함
gameObject.tag = "Hit";
}
}
}
Scorer.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Scorer : MonoBehaviour
{
// 점수를 담을 변수
int hits = 0;
private void OnCollisionEnter(Collision collision)
{
// 충돌한 객체의 태그가 Hit이면(이미 충돌한 객체이면) 스킵
// if (collision.gameObject.tag != "Hit")과 반대
if (collision.gameObject.tag == "Hit")
return;
hits++;
// 문자열 + 변수이름 하면 붙어서 출력 (문자열변수 이런 식)
Debug.Log($"You've bumped into a thing this many times: " + hits);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Scorer : MonoBehaviour
{
// 점수를 담을 변수
int hits = 0;
private void OnCollisionEnter(Collision collision)
{
// hits가 hits에 1을 더한 값
// hits = hits + 1;와 동치
hits++;
// 문자열 + 변수이름 하면 붙어서 출력 (문자열변수 이런 식)
Debug.Log($"You've bumped into a thing this many times: " + hits);
}
}
문제과 해결방안
해결할 문제 : 개체가 3초 정도 이후에 떨어지게 만드는 것
해결책 :
1. 타이머 - Time.time
2. 3초가 지나면 무엇인가를 하는 메커니즘 - if문
3. 개체를 3초 이후에 떨어지게 하는 방법 - disable / enable gravity (3초 이후에 중력 활성화)
Time.time
게임이 시작하고 난 이후부터 소요된 초 단위의 시간
- Time클래스의 프로퍼티 중 하나
- 읽기전용(접근은 가능해도 변경할 수 없음)
Dropper.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dropper : MonoBehaviour
{
void Start()
{
}
void Update()
{
Debug.Log(Time.time);
}
}
If
Dropper.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dropper : MonoBehaviour
{
[SerializeField]
private float seconds;
void Start()
{
// bool 값이 true(참)이면 if문 코드 실행 아니면 스킵
/*if (bool 값)
{
무언가를 하시오
}*/
}
void Update()
{
// 조건
if (Time.time > seconds)
{
Debug.Log($"{seconds} seconds has left");
}
}
}
Rigidbody
Rigidbody컴포넌트의 Use Gravity는 키면 중력을 허용하고 끄면 중력을 허용하지 않는다.
- MeshRenderer컴포넌트처럼 껐다가 킬 수 있음 => 둘 다 꺼서 떨어지기 전엔 안 보이도록 함
캐싱
자주 사용되는 데이터나 정보를 필요할 때 쉽게 접근할 수 있도록 메모리에 저장하는 기술
Dropper.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dropper : MonoBehaviour
{
// Meshrenderer형을 담는 renderer
MeshRenderer renderer;
Rigidbody rigid;
[SerializeField]
private float seconds;
void Start()
{
// GetComponent<MeshRenderer>().enabled = false;
// 캐싱
renderer = GetComponent<MeshRenderer>();
renderer.enabled = false;
rigid = GetComponent<Rigidbody>();
rigid.useGravity = false;
}
void Update()
{
// 조건
if (Time.time > seconds)
{
Debug.Log($"{seconds} seconds has left");
renderer.enabled = true;
rigid.useGravity = true;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectHit : MonoBehaviour
{
// private은 이 함수가 이 클래스 내에서만 접근할 수 있다는 말임
// Collision은 부딪힌 대상에 대한 정보가 들어있음
// 들어왔을 때 충돌을 감지함 (들어올 시점에 1번) - 떨어졌다 다시 부딪치면 다시 감지
private void OnCollisionEnter(Collision collision)
{
Debug.Log("Bumped into a wall");
// GetComponent메서드
GetComponent<MeshRenderer>().material.color = new Color(1, 0, 0, 1); // red
}
}
이번 주에는 유니티 생애주기, 싱글톤 패턴과 옵저버 패턴, UI에 대해서 배웠다. 유니티 생애주기가 왜 이런 순서로 되어있고 프로그래밍을 할 때 이 생애주기를 참고하면 된다고 배웠다. 싱글톤 패턴은 게임 매니저와 같이 객체들을 관리하는 객체를 따로 두어 유일한 객체로 만들고 이 객체에 대한 접근은 어디서든 할 수 있게 하는 패턴이다. 옵저버 패턴은 subject가 object가 하는 일들을 대신 호출해주고 object는 subject로만 함수를 실행하게 되는 패턴이다. 옵저버 패턴은 싱글톤 패턴과 자주 혼용되어 사용된다고 배웠다. UI는 팝업 창, 버튼 등등 유저가 상호작용할 수 있는 것들인데 유니티의 내장 UI와 TextMesh Pro, Extension UI도 설치해 사용해 보는 시간을 가졌다.
이번 주에 배우면서 느낀 점은 UI요소들이 너무 많다는 점이었다. UI를 배우는 것 자체가 코드 보다는 일단 다 씬에 배치해보고 어떤 기능인지 아는 게 중요한데 수가 많다보니까 시간이 조금 더 걸린 것 같았다. 또 Rect transform 개념이 이해하기 쉽지 않았는데 앵커에서 축끼리 min과 max가 같으면 포인트가 되고 너비를 줄 수 있고, min max가 다르면 범위가 되어 마진 값을 줄 수 있다고 생각하니까 이해가 되었다. pivot 부분도 헷갈렸는데 pivot은 좌측 아래부터 x와 y값이 있는 로컬 기준점이라고 생각하니 이해가 되었다.
이번 주에 배운 UI들은 많기도 하고 내가 모르는 부분이 더 많은 느낌이었다. 되게 간단한 버튼 UI나 Text UI만 다룰 수 있었는데 다른 여러가지 UI들도 계속 사용해봐야지 용도를 이해할 수 있는 것들이기에 앞으로 계속 써봐야겠다는 생각이 들었다. 이번에 과제를 할 때도 기본 과제와 심화과제의 UI를 다른 방식으로 사용해서 제출하는 것을 목표로 하고 있는데 이것으로 UI 적용 부분에서 다른 상황에도 적용할 수 있는 유연성을 가졌으면 좋겠다.
UI까지 배우면서 이렇게 계속 진행하면 뭔가 만들 수 있을 것 같다는 생각이 들었다. 내가 성장하는 느낌이 들고 이게 많은 양의 지식을 습득하는 데 긍정적인 영향을 주는 것 같아서 기분이 좋았다. 기본 과제부터 심화 과제까지 정복하여 잘해지고 싶은 마음 뿐이다. 다음 주도 화이팅 하자!