도어락을 구현하기 위해 키패드를 만드는 방법을 고안해봤다.


블렌더로 단순한 키패드 모양을 만들고, 하위요소는 다음과 같이 구성되어 있다.
TextMeshPro 오브젝트에 접근하기 위해서 비밀번호가 표시될 AnsBg(상단 박스)은 유니티에서 따로 생성했다.(Confirm버튼은 그냥 내가 까먹어서 유니티에서 만들었다 ㅎㅎ..)
마찬가지로 RayCast를 사용해서 키 클릭을 감지하도록 했다.
+ 시점 고정 키도 좌클릭에서 F로 통일해서 수정해뒀다.
public class Keypad : MonoBehaviour
{
[SerializeField] private TMP_Text AnsBox;
private string Answer = "1229";
public string num;
private void Update()
{
// 마우스 클릭 검출
if (Input.GetMouseButtonDown(0))
{
RaycastHit hit = CastRay();
if (hit.transform == transform)
{
Debug.Log("터치된 오브젝트: " + hit.transform.name);
if(hit.transform.name == "Confirm")
{
StartCoroutine(CheckAns());
}
else OnNumClick(num);
}
}
}
IEnumerator CheckAns()
{
if (AnsBox.text == Answer) AnsBox.text = "CORRECT";
else
{
AnsBox.text = "WRONG";
yield return new WaitForSeconds(1f);
AnsBox.text = "";
}
}
void OnNumClick(string number)
{
AnsBox.text += number;
}
}

스크립트에서 private 필드를 직렬화하기 위해서 사용한다.
인스펙터를 통한 값의 입력 등이 가능해지고, 시간 절약이 된다고 하니 한 번 써봤다.
시간 지연과 관련된 내용이다.
비밀번호를 입력했을 때 틀렸을 경우, "WRONG"문구를 띄운 후 1초 후 칸을 비우도록 구현하고자 했다.
The body of “ cannot be an iterator block because ‘void’ is not an iterator interface type.
CheckAns()함수를 보면 다음과 같은 코드가 보인다.
yield return new WaitForSeconds(1f);
이는 지정된 시간 후에 다음 코드를 재개하도록 해준다.
파이썬의 Time.sleep(1), C/C++의 Sleep(1000)과 동일한 효과인 것 같다.
코루틴(Coroutine)은 시간의 경과에 따른 절차적 단계를 수행하는 로직을 구현하기 위해 사용되는 함수다.
반환값으로 IEnumerator형식을 가지기 때문에 함수가 void가 아닌 IEnumerator형식이고, 이를 실행하기 위해 Coroutine함수가 호출이 되었다.
hit는 충돌체의 정보를 갖고 있었다. 때문에hit.transform.name 으로 충돌체의 오브젝트 이름을 참조할 수 있다.AnsBox의 text에 접근하고자 한다면 AnsBox.text와 같이 접근이 가능하다.아무리 위의 코드를 추가해도 버튼이 눌리지 않았었다. 이를 해결하는 데에만 시간을 너무 많이 썼다..ㅠ
계층구조를 보면,
doorlock
ㄴ AnsBg
ㄴ keys
ㄴ Confirm
등등으로 우리가 눌러야 할 버튼들이 하위요소로 들어가 있다.
상위요소에는 RigidBody, Collider가 설정되어 있고 keys는 Collider만 있었다.
구글링을 해보니, RayCast는 부모요소를 참조한다고 한다. 때문에 하위요소에도 접근하고자 하면 그 요소들에도 RigidBody를 설정해줘야 한다고 했다.
자식요소가 rigidBody가 없다면 리지드바디가 포함된 부모의 Collider로 인식하기에 개별로 인식하게 하고 싶다면 각각 설정해줘야 한다고 한다.

코드 전개에 대한 구글링을 최소화하고자 노력했다. 때문에 코드가 조금은 지저분한 것 같다..
아직 유니티 애니메이션에는 익숙하지 않아서, 추후 버튼을 클릭했을 때 버튼이 실제 눌리는 것처럼 애니메이션을 구현하고, 비밀번호가 일치할 때 문이 열리는 것까지 구현할 예정이다.
또한, Collider 및 RigidBody도 아직 익숙치 않아서.. 시점고정이 되지 않은 상태(F키 안누른 상태)에서도 버튼이 눌린다. ㅎㅎ고쳐보겠다