본문 바로가기

유니티와 놀기

(5)
delegate 사용하기 delegate는 특정 반환값과 인자를 받는 함수의 형을 선언해서 함수를 변수처럼 전달받을 수 있게한다. 다음은 예시를 위해 간단히 체력을 담당하는 스크립트를 만들었다. OnHealthSliderChange는 UI의 슬라이더가 움직일 때 마다 호출된다. public class Health : MonoBehaviour { public delegate void HealthCallback(float health); public HealthCallback healthCallback; public void HealthChange(float health) { Debug.Log("Method " + health); } void Start() { healthCallback += HealthChange; healthCa..
간단한 단색 그래픽 만들기 비주얼적으로 단색만을 사용하는 게임을 만들고 있다. 내가 원하는 것은 * 포인트 라이트를 사용해 그림자가 원형으로 퍼져 나간다. * 빛을 받는 곳은 단색, 받지 않는 곳과 그림자 지는 부분은 검은색으로 나와야 한다. * 빛의 강도에 따라 색은 원색에서 검은색으로 바뀌어야 한다. 이 조건을 해결하면서 여러 시행착오를 겪었는데, 어떤 과정이 있었는지 써보고자 한다. _유니티의 기본 쉐이더를 사용 처음 시도한 방법은 포인트 라이트의 intensity를 올려 음영이 지는 부분을 없애고, 화면이 어두워지는 효과를 카메라 앞에 반투명한 상자를 씌우는 식으로 만드는 것이었다. 머티리얼은 기본 제공되는 것에서 metalic을 1로 smooth를 0으로 설정했다. 얼추 작동하는 것 같지만 몇가지 문제가 있다. inten..
코루틴 뒤에 코루틴을 실행시키기 만약 어떤 오브젝트가 시간에 따라 사라지거나 움직이는 기능을 만들고 싶다면 Update함수와 Time.deltaTime을 활용해 만들 수 있다. 하지만 이 방법은 하나뿐인 Update함수를 복잡하게 만든다. 이때 코루틴은 유니티에서 Update외 다른 루틴을 만들 수 있게 해준다. public class MoveForSeconds : MonoBehaviour { public int time; private Vector3 start; void Start() { start = transform.position; } public IEnumerator CoMoveForSeconds() { float timer = 0.0f; while (timer < time) { timer += Time.deltaTime; t..
체스말을 잡기 저번에 만든 것으로 폰부터 퀸까지의 말을 만들고 배치했다. 다음으로 말을 잡는 법을 만들어보자. 지금까지 기능으로는 상대의 말이 내 경로에 있을 경우 자신의 말과 구분하지 못하고 막혀버린다. 그리고 폰의 경우 앞으로 전진하고 대각선으로 잡는 독특한 행마법을 가지고 있어서 행마처리를 일관적으로 만들기 어렵다. 그래서 보드에 해당칸이 비어있는지를 알려주는 IsCoordAvailable()에 더불어 해당 칸이 잡을 수 있는 칸인지를 알려주는 IsCoordCatchable()을 추가하고, 이동 가능한 칸을 계산하는 MoveableCoord()에서 말마다 각각 계산하기로 했다. 퀸, 룩, 비숍은 이동 가능한 방향으로 나아가면서 막혀있는지 확인한다. 막혀있으면 잡을 수 있는 칸인지 확인하고 다음 방향으로 넘어간다...
체스말을 움직이기 최근에 체스가 재밌어서, 재미삼아 체스와 비슷한 것을 만들어보기로 했다. 처음에는 가장 기본적인 말을 움직이는 기능을 만들었다. 우선 스프라이트를 배치해 8x8 크기의 보드를 만든다. 이때 칸의 좌표는 칸의 중심을 가리키게 했다. 체스 판을 담당하는 Board스크립트를 만들고 칸의 개수와 한 칸의 크기를 나타내는 상수를 만든다. 앞으로 칸 위의 위치는 Board의 CoordinateToWorld()를 통해 얻게 하여 다른 좌표와 혼동되는 일이 없게 한다. public class Board : MonoBehaviour { private static readonly int xLength = 8; private static readonly int yLength = 8; private static readonl..