091

[C#] Unity 속 C# script(5) : 사용자입력스크립트 본문

Programming Language/C#

[C#] Unity 속 C# script(5) : 사용자입력스크립트

공구일 2024. 12. 8. 04:53
728x90

* 언급이 없을 경우 기즈모방향이 왼쪽좌표계인 경우를 기준으로 말하고 있습니다. *

01. 움직이는 방향을 화살표로 선택하기

-> Y,Z축에서 앞뒤로 회전하는 Cube(넓게 판으로 만듦) == X축을 회전축으로 두고 있음

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ground_ggi : MonoBehaviour
{
    void Update()
    {
        float xRotation = transform.localEulerAngles.x;
        xRotation += Input.GetAxis("Horizontal");
        transform.localEulerAngles = new Vector3(xRotation,0,0);
    }
}

 

- transform.localEulerAngles은  x,y,z축으로 얼마만큼 회전되었는가를 부모 오브젝트를 기준으로 한 회전을 나타냄, Euler 각도는 3D 회전을 3개의 축을 기준으로 분해한 값으로 그 축을 기준으로 a도 만큼 회전되었다는 의미 -> 앞으로 움직인다는 것은 X축을 기준으로 (+)로 볼 때 돌아가는 방향이 오른쪽이면(=뒤로 가면) (+)각도만큼 변해야한 다는 의미임

 

- Input.GetAxis("Horizontal")은 기본 Input Manager에서 정의된 입력 축으로, 왼쪽-오른쪽 방향 입력에 대응하여 <-(A),->(D)를 누를씩 각각 -1, 1이 입력됨, 0은 입력없음을 나타내며 조이스틱과 같은 입력의 경우 중간값인 0.5의 부동소수점 값을 가질수도 있음(-1에서 1 사이의 부동소수점 값을 가짐) 

-> GetAxis()의 경우 입력값을 부드럽게 변화시켜주는 특성이 있는데 이를 원치않으면 GetAxisRaw()를 사용하면 됨(즉각적인 변화 가능)

 

-> X,Z축에서 앞뒤로 회전하는 Cube(넓게 판으로 만듦) == Y축을 회전축으로 두고 있음

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ground_ggi : MonoBehaviour
{
    void Update()
    {
        float yRotation = transform.localEulerAngles.y;
        yRotation -= Input.GetAxis("Horizontal"); //마이너스로 수정
        transform.localEulerAngles = new Vector3(0,yRotation,0); //회전축을 Y축으로 수정
    } 
}

- (<-)를 눌렀을 때 왼쪽으로 회전한다는 것은 Y의 (+)축에서 오른쪽으로 회전한다는 것과 같은 말이고 그렇다는 것은 -1(<-)을 yRotation에 추가할 때마다 yRotation의 값이 커져야한다는 의미임으로 연산자를 마이너스로 바꿔줌

 

-> X,Y축에서 앞뒤로 회전하는 Cube(넓게 판으로 만듦) == Z축을 회전축으로 두고 있음

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ground_ggi : MonoBehaviour
{
    void Update()
    {
        float zRotation = transform.localEulerAngles.z;
        zRotation -= Input.GetAxis("Horizontal"); //마이너스로 바꿈
        transform.localEulerAngles = new Vector3(0,0,zRotation); //회전축을 Z축으로 바꿈
    }
}

- (<-)를 눌렀을 때 왼쪽으로 회전한다는 것은 Z의 (+)축에서 오른쪽으로 회전한다는 것과 같은 말이고 그렇다는 것은 -1(<-)을 zRotation에 추가할 때마다 zRotation의 값이 커져야한다는 의미임으로 연산자를 마이너스로 바꿔줌

 

+) Input.GetAxis()의 경우 "Vertical", "Mouse X", "Mouse Y", "Fire1", "Jump" 등을 가져올 수 있음

 

02. 키 입력받기

-> GetKeyDown()

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ball_ggi : MonoBehaviour
{
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.R))
        {
            GetComponent<Rigidbody>().AddForce(Vector3.right * 100);
        }
    }
}

- Input.GetKeyDown(KeyCode.R)은 키가 눌린 순간 1프레임에만 true를 반환함 -> 키를 눌려있는 동안 계속 true를 반환하고 싶거나 떼었을 때 감지하고 싶을 경우에는 각각 GetKey(), GetKeyUp()를 사용해주면 됨

-> KeyCode의 프로퍼티

• 알파벳 키 : KeyCode.A ~ KeyCode.Z

• 숫자키 : (위쪽 키보드) KeyCode.Alpha0 ~ KeyCode.Alpha9

• 특수키 : KeyCode.Space(스페이스바), KeyCode.Return(엔터키)..

 

- GetComponent<Rigidbody>()은 GetComponent는 컴포넌트 자료형을 가지고 오는 속성으로 앞에 gameObject.이 써있지 않아도 해당 스크립트가 붙은 오브젝트의 Rigidbody를 가지고 옴 -> AddForce()는 객체에 물리적인 힘을 적하는 메서드로 force를 필수적으로 작성해줘야함 -> Vector3.(사진속위치값) * 힘의크기를 곱해서 나타낼 수 있음

 

 

-> GetMouseButton()

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Input_ggi : MonoBehaviour
{
	int value = 5;
    void Update()
    {
        if(Input.GetMouseButton(1))
            transform.localEulerAngles = new Vector3(value--,0,0);
         if(Input.GetMouseButton(0))
            transform.localEulerAngles = new Vector3(value++,0,0);
    }
}

- 마우스의 오른쪽 버튼을 1, 왼쪽 버튼을 0누를 때 조건에 충족해 true를 1프레임만 반환함

 

03. 응용

-> 방향키를 지속적으로 누르고 있으면 계속 그 영향하에 있게 함

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Input_ggi : MonoBehaviour
{
    void Update()
    {
        if(Input.GetKey(KeyCode.RightArrow))
            GetComponent<Rigidbody>().AddForce(Vector3.back * 100);
        if(Input.GetKey(KeyCode.LeftArrow))
            GetComponent<Rigidbody>().AddForce(Vector3.forward * 100);
    }
}

 

-> 스페이스바를 누르고 있으면 공이 위로 움직이고 누르지 않을 경우 아래로 움직이게 함

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Input_ggi : MonoBehaviour
{
    void Update()
    {
        if(Input.GetKey(KeyCode.Space)){
            GetComponent<Rigidbody>().AddForce(Vector3.up * 100);
        }else GetComponent<Rigidbody>().AddForce(Vector3.down * 100);
    }
}

 

더보기

* 일부 출처 - 고수정, ”게임프로그래밍 ”, 인덕대학교

728x90

'Programming Language > C#' 카테고리의 다른 글

[C#] Unity 속 C# script(7) : 충돌스크립트  (6) 2024.12.10
[C#] Unity 속 C# script(6) : 메서드  (5) 2024.12.08
[C#] Unity 속 C# script(4)  (8) 2024.10.21
[C#] Unity 속 C# script(3)  (3) 2024.10.20
[C#] Unity 속 C# script(2)  (3) 2024.10.19