목록전체 글 (58)
시작은 0부터
게임을 만들면서 플레이어는 X축으로만 이동하고 플레이어가 Z축으로 전진하는 것이 아니라 적 오브젝트들이 -Z로 다가오는 방식으로 게임을 구현했더니, 플레이어가 '부스터'아이템을 얻었을 때 속도가 증가하는 효과를 반영하기 위해서 생성되는 모든 오브젝트들의 다가오는 속도를 증가시켰다. speed = FindObjectOfType().GetComponent().localSpeed; GameManager라고 이름을 붙인 빈오브젝트 안에 넣어둔 게임매니저 컴포넌트 안에 있는 로컬스피드 변수를 대입한다. 이 값은 실시간으로 반영되어야하기 때문에 Update 함수에 해당 코드를 넣었다. 플레이어가 아이템을 얻었을 때 랜덤확률로 부스터, 공격 속도 증가, 공격력 증가를 얻을 수 있도록 만들었고, 공격속도와 공격력도 G..
플레이어가 총알을 발사할 때, 적이 생성될 때, 적이 총알을 발사할 때마다 프리팹이 씬에 계속 생성되어 프리팹의 구분이 어려워졌다. 이를 해소하기 위해 프리팹이 생성될 떄 생성되는 위치를 지정해줄 수 있다는 사실을 알게 되어, 사용방법을 구글링으로 찾아봤다. Instantiate(Prefab, transform.position, transform.rotation) Prefab.transform.parent = this.transform 생성후 생성한 오브젝트의 부모위치를 해당 위치로 지정한다는 원리인데 이걸 프리팹으로 할 경우 프리팹을 생성하기도 전에 부모 위치를 설정하려고해서 오류가 났었다. 이를 해결하기 위해서 프리팹의 경우에는 생성 후, 생성된 프리팹 안에서 부모 위치를 설정하는 것으로 해야 오류가..
슈팅게임을 만들면서 새로운 적의 형태를 만들어보고싶어 메탈슬러그에 나오는 빨간 헬기를 선봉으로 한 헬기무리를 구현해보고싶었다. 가장 선두에 있는 빨간 헬기를 잡으면 나머지 적들도 연쇄적으로 잇따라 폭발하며 사망하는 기능을 구현하기 위해 빈 오브젝트를 생성하고 그 안에 빨간 헬기 역할을 할 오브젝트(이하 맨앞)와 뒤따라올 헬기들 역할을 할 오브젝트들을 넣었다. 그리고 맨앞 오브젝트에는 사망시 뒤따라올 오브젝트들도 사망시킬 오브젝트를 만들기 위해 다음과 같이 코드를 짰다. void Update() { if(hp
코루틴(Coroutine) : 스레드 형식은 아니지만 스레드처럼 딜레이를 주면서 메인 프로그램을 진행시킬 수 있다. 원리는 딜레이를 준 코루틴을 한번 돌고 > 메인 한줄 돌고 > 코루틴 한번 돌고... 를 빠른 속도로 처리하여 마치 다중 처리가 되는 것같은 효과를 준다. 형식은 다음과 같다. StartCoroutine(A()); IEnumerator A(); { yield return new WaitForSeconds(1); a++; } StartCoroutine으로 코루틴함수인 IEnumerator 를 호출하면 호출한 시점에서 1초 뒤에 a++를 실행한다. 이때 1초를 지연시키는 동안 프로그램처리가 멈추는 것이 아니기 때문에 프로그램은 계속 동작하면서 코루틴함수를 설정한 시간값이 지난 이후에 실행하는 ..
RigidBody 내부 기능 중에 isTrigger라는 bool 값이 있다. True(체크)면 충돌기능은 없고 콜라이더가 닿았는지를 판정한다. 그래서 콜라이더만으로는 오브젝트와 오브젝트간의 물리적 충돌을 발생시킬 수 없고, 트리거만 작동시킬 수 있다. 슈팅게임을 만들면서 부딪혔던 문제다. LookAt 기능을 사용할 때, 쳐다보는 오브젝트가 대상 오브젝트와 위치값이 다르면 쳐다보는 방향이 부정확할 수 있다. 이를 맞추는 방법으로 대상이 쳐다보는 오브젝트를 빈 오브젝트로 만들어 시선을 빈 위치에 고정시키고 원래의 대상 오브젝트를 빈 오브젝트의 자식으로 넣어 값을 수정하면 쳐다보는 오브젝트와 기존 오브젝트의 위치값이 상이하더라도 정상적으로 작동시킬 수 있다. Material 속성 중 Metal 속성을 쓰면 배..
Rotate, 해당 축을 기준으로 회전한다. Position X,Y,Z 와 Rotation의 X,Y,Z가 헷갈리는 경우에는 각 방향의 축을 나타내는 화살표에 면 방향을 한 돌림판을 꽂아놨다고 생각하면 이해하기 쉽다. 예로, Rotate.X 는 좌우 방향의 막대기에 꽂혀 있는 돌림판이고, 이 돌림판은 좌우 방향을 면으로 하고 있으니 회전은 Z축으로 한다. 그러므로 Rotate.X에 값을 주면 Z축(앞뒤) 회전을 하는 것이다. transform.Rotate를 사용하면 기존 rotation(회전도)에 회전값을 더한다. 그런데 처음부터 메쉬가 유니티 시스템에 맞게 축 3개(X, Y, Z)가 설정되어 있지 않다면 메쉬를 제대로 사용하기 위해 회전을 해야한다. 그런데 회전이 설정된 상태에서 transform.Tra..
유니티에는 C#처럼 객체 지향이면서 클래스와는 다른 컴포넌트라는 개념이 있다. 클래스는 붕어빵을 찍어내는 붕어빵틀의 개념이라고 익혔다. 붕어빵을 찍어내기 위한 구성, 붕어빵 틀 기계, 불, 밀가루 반족, 앙금 등의 재료를 멤버변수로 가졌기 때문에 붕어빵을 만들 때마다 일일이 각각의 기계, 불, 반죽 등등을 만들지 않아도 붕어빵 틀 안에 그에 해당하는 요소들이 멤버변수로 지정되어있기 때문에 간편하게 동일한 멤버변수를 사용하는 객체를 생성하는 데 용이하다. 하지만 붕어빵이 아니라 식빵을 만든다면? 이미 만들고 사용중인 붕어빵틀(클래스)로 붕어빵만 찍다가 식빵을 만들 수는 없다. 식빵에는 붕어빵 틀 기계나 앙금 같은 멤버변수는 불필요하기 때문이다. 이러한 문제를 해결하기 위해 유니티에서는 클래스 개념이 아닌 ..
C#에서는 콘솔창에 입력값을 출력하기 위해서 Console.WriteLine() 을 썼다. 유니티에도 디버그 목적으로 사용하는 콘솔창이 있고 해당 콘솔창에 입력값을 출력하는 함수가 있다. Debug.Log(" ") : 유니티의 콘솔창(디버그창)에 로그를 띄우는 기능이다. 클래스의 실행 순서 : 유니티에서 C# 스크립트를 생성하면 자동으로 클래스가 생성된다. 별도의 객체 생성을 선언하는 생성자 없이도 자동으로 클래스가 생성되며, 오브젝트에 해당 클래스를 사용하면 해당 클래스의 기능들이 해당 오브젝트에 적용된다. 클래스를 생성하면 자동으로 함수 Start 와 Update가 생성되는데, 이 이외에도 유니티 클래스는 실행순서가 정해진 함수가 있다. Class A : MonoBehavior { void Awake..