코딩inf
#2 입력키 출력--------------------------[6/5] 본문
지난번에 만들었던 코드 수정하겠습니다.
text출력을 위해 [Canvas]를 만들겠습니다.
canvas를 추가하고 canvas를 더블클릭하여 이동합니다.
그러면 아래 사진 처럼 하양 박스가 보여야 합니다
그런데 안보이면 scene창에서 2d버튼을 클릭하시면 보이실 수도 있습니다.
그리고 보이시는 분도 2D버튼 클릭하셔야 합니다.
그래야 설정하실 수 있어요
그리고 canvas => 우클 => UI =>text를 추가해 줍니다.
text mesh pro 아닙니다.
그러면 텍스트 박스가 생성이 되는데 드래그해서 원하는 위치로 이동시켜 줍니다.
그런데 좌측 하단을 추천합니다.
기본 텍스트는 삭제해 줍니다.
그리고 여러 키를 누르면 모두 표시되어야 하기 때문에 길이를 늘려 줍시다.
-----------------------------지금까지한 오브젝트----------------------------
---------------------------------------------------------------------------------------------
잠깐 중간 점검 했고요 이제 scripts파일로 갑시다
대부분의 입력을 camera에서 했기 때문에 camera_1파일을 실행시키고 아래 코드를 작성합니다.
추가된 부분은 색을 바꾸겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Camera_1: MonoBehaviour
{
public float Speed = 0.1f; // 키패드 회전 속도
public float turnSpeed = 2.0f; // 마우스 회전 속도
public float moveSpeed = 10.0f; // 이동 속도
private float xRotate = 0.0f; // 내부 사용할 X축 회전량은 별도 정의 ( 카메라 위 아래 방향 )
public Text key;
private void Start()
{
Cursor.visible = false;
}
void Update()
{
MouseRotation();
KeyboardMove();
Shift();
MoveCamera();
GetKeybord();
}
// 마우스의 움직임에 따라 카메라를 회전 시킨다.
void MouseRotation()
{
// 좌우로 움직인 마우스의 이동량 * 속도에 따라 카메라가 좌우로 회전할 양 계산
float yRotateSize = Input.GetAxis("Mouse X") * turnSpeed;
// 현재 y축 회전값에 더한 새로운 회전각도 계산
float yRotate = transform.eulerAngles.y + yRotateSize;
// 위아래로 움직인 마우스의 이동량 * 속도에 따라 카메라가 회전할 양 계산(하늘, 바닥을 바라보는 동작)
float xRotateSize = -Input.GetAxis("Mouse Y") * turnSpeed;
// 위아래 회전량을 더해주지만 -45도 ~ 80도로 제한 (-45:하늘방향, 80:바닥방향)
// Clamp 는 값의 범위를 제한하는 함수
xRotate = Mathf.Clamp(xRotate + xRotateSize, -90, 90);
if (Input.GetKey(KeyCode.Keypad8))
{
xRotate = xRotate - Speed;
}
if (Input.GetKey(KeyCode.Keypad5))
{
xRotate = xRotate + Speed;
}
if (Input.GetKey(KeyCode.Keypad4))
{
yRotate = yRotate - Speed;
}
if (Input.GetKey(KeyCode.Keypad6))
{
yRotate = yRotate + Speed;
}
if (Input.GetKey(KeyCode.Keypad9))
{
Speed = Speed + 0.001f;
Debug.Log(Speed);
}
if (Input.GetKey(KeyCode.Keypad7))
{
Speed = Speed - 0.001f;
Debug.Log(Speed);
}
// 카메라 회전량을 카메라에 반영(X, Y축만 회전)
transform.eulerAngles = new Vector3(xRotate, yRotate, 0);
}
// 키보드의 눌림에 따라 이동
void KeyboardMove()
{
// WASD 키 또는 화살표키의 이동량을 측정
Vector3 dir = new Vector3(
Input.GetAxis("Horizontal"),
0,
Input.GetAxis("Vertical")
);
// 이동방향 * 속도 * 프레임단위 시간을 곱해서 카메라의 트랜스폼을 이동
transform.Translate(dir * moveSpeed * Time.deltaTime);
}
void Shift()
{
if(Input.GetAxis("CameraShift") > 0)
{
moveSpeed = 20.0f;
}
else
{
moveSpeed = 10.0f;
}
}
void MoveCamera()
{
Vector3 dir = new Vector3(
0,
Input.GetAxis("Camera_2"),
0
);
transform.Translate(dir * moveSpeed * Time.deltaTime);
}
public bool w_ = false;
public int printw = 0;
public bool s_ = false;
public int prints = 0;
public bool a_ = false;
public int printa = 0;
public bool d_ = false;
public int printd = 0;
public bool q_ = false;
public int printq = 0;
public bool e_ = false;
public int printe = 0;
public bool left_shift_ = false;
public int printleft_shift = 0;
void GetKeybord()
{
if (Input.GetKeyDown("w")) { w_ = true; }
if (Input.GetKeyUp("w")) { w_ = false; }
if (Input.GetKeyDown("s")) { s_ = true; }
if (Input.GetKeyUp("s")) { s_ = false; }
if (Input.GetKeyDown("a")) { a_ = true; }
if (Input.GetKeyUp("a")) { a_ = false; }
if (Input.GetKeyDown("d")) { d_ = true; }
if (Input.GetKeyUp("d")) { d_ = false; }
if (Input.GetKeyDown("q")) { q_ = true; }
if (Input.GetKeyUp("q")) { q_ = false; }
if (Input.GetKeyDown("e")) { e_ = true; }
if (Input.GetKeyUp("e")) { e_ = false; }
if (Input.GetKeyDown("left shift")) { left_shift_ = true; }
if (Input.GetKeyUp("left shift")) { left_shift_ = false; }
if (w_ == true && printw == 0) { key.text = key.text + "w + "; printw = 1; }
if (w_ == false){ key.text = key.text.Replace("w + ", ""); printw = 0; }
if (s_ == true && prints == 0) { key.text = key.text + "s + "; prints = 1; }
if (s_ == false) { key.text = key.text.Replace("s + ", ""); prints = 0; }
if (a_ == true && printa == 0) { key.text = key.text + "a + "; printa = 1; }
if (a_ == false) { key.text = key.text.Replace("a + ", ""); printa = 0; }
if (d_ == true && printd == 0) { key.text = key.text + "d + "; printd = 1; }
if (d_ == false) { key.text = key.text.Replace("d + ", ""); printd = 0; }
if (q_ == true && printq == 0) { key.text = key.text + "q + "; printq = 1; }
if (q_ == false) { key.text = key.text.Replace("q + ", ""); printq = 0; }
if (e_ == true && printe == 0) { key.text = key.text + "e + "; printe = 1; }
if (e_ == false) { key.text = key.text.Replace("e + ", ""); printe = 0; }
if (left_shift_ == true && printleft_shift == 0) { key.text = key.text + "left shift + "; printleft_shift = 1; }
if (left_shift_ == false) { key.text = key.text.Replace("left shift + ", ""); printleft_shift = 0; }
}
}
코드 파일
일단 unity 엔진 UI를 추가를 해주시고요
코드에 사용할 변수 key를 생성해 줍니다.
[(키 이름) + _] 로 구성된 변수는 키가 눌러짐을 나타내는 변수입니다.
그리고 [print + (키 이름)]으로 구성된 변수는 화면에 한번만 출력되도록 변수 값이 1이면 if 문이 실행하지 않도록
설정을 했습니다.
if (Input.GetKeyDown("w")) { w_ = true; }
if (Input.GetKeyUp("w")) { w_ = false; }
이 부분은 키를 눌렀을때는 true 뗐을때는 false로 설정해주는 코드입니다.
if (w_ == true && printw == 0) { key.text = key.text + "w + "; printw = 1; }
if (w_ == false){ key.text = key.text.Replace("w + ", ""); printw = 0; }
여기가 중요합니다.
일단 text에 출력 되기 위한조건은 키가 눌러져 있어야 하고 한번도 출력되지 않은 키여야 하기 때문에
첫번째 줄 처럼 코드를 만들었습니다.
그리고 그 다음줄은 키를 뗐을때 출력된 text를 없애주는 역할을 하는 코드인데요
일단 조건은 키가 안눌러져 있어야 합니다.
중요한 문법은
key.text 인데요
먼저 제일 위에서
만든 key변수에 있는 text를 의미합니다.또 입력할 text는 우항에 적으실 겁니다.
우항 : 현재 있는 text에 키 이름 +를 출력해주고 출력 횟수를 1로 설정하여 한번만 출력하도록 합니다.
key.text.Replace는 좌측 값에 있는 문자열을 우측의 값으로 바꿔주는건데 저는 없앨 것이기 때문에 "" 로 한것입니다.
또 없애 주었기 때문에 출력 횟수는 다시 0으로 지정합니다.
최종 영상
'Unity > TowerDiffence' 카테고리의 다른 글
#5 적 이동 스크립트 구현 / 타워설치(돈 감소) (6/24) (0) | 2021.06.24 |
---|---|
#4 에임 위에 있는 오브젝트 색 변화시키기(6/8) (0) | 2021.06.08 |
#3 에임위에 있는 오브젝트 이름 출력 [Raycast] (6/6) (0) | 2021.06.06 |
#0 기획하기 (0) | 2021.06.04 |
#1 오브젝트 세팅 및 카메라 이동 --------------------[6/3] (0) | 2021.06.03 |