유니티 한영 키 - yuniti han-yeong ki

개발 강좌

Unity3D 에서 한영 전환시 키입력 문제 우회하기

별바람입니다.

오랫만에 개발 관련 글을 올립니다.

PC 온라인 플랫폼으로 신작 "코드 블랙"을 개발 중,

채팅등을 위해 한글 전환시에 키보드 입력을 받지 않는 문제가 생겨서 확인하다보니,

Unity3D 의 Input.GetKey() 계열의 명령이 영문 키보드만 받는다는 사실을 깨달았습니다.

일단 한글 키가 켜져있다는 경고를 주고 넘길까 했으나,

역시나 그건 별로 좋지 않은 해결책이라 생각해서 귀차니즘을 이기고 우회하기 위한 코드를 짜봤네요.

일단 윈도우즈의 user32.dll 을 유니티에서 불러와서,

GetAsyncKeyState 명령을 사용해서 키 입력을 받는 방식이며,

유니티의 KeyCode 체계를 윈도우즈의 Virtual Keycode 로 전부 매핑했습니다.

(즉 유니티의 GetKey(KeyCode.A) 방식의 명령어를 그대로 쓸 수 있습니다)

사용 방법은 WindowsInput.cs 를 프로젝트에 포함시킨 후 using WindowsInput 을 선언,

Input.GetKey(KeyCode) 를 WinInput.GetKey(KeyCode) 으로 수정해주면 됩니다.

(Input 을 WinInput 으로 바꿔주시기만 하면 됩니다)

Update) 생업이 바빠서 업데이트가 늦었습니다. ㅠㅠ

2021.01.08: 키 입력이 남아있는 버그 수정 (도움주신분: 우유돌컴)

2021.01.08: GetKeyDown, GetKeyUp 추가 (도움주신분: Flashscape)

GitHub :

https://github.com/Byulbram/WinInput.git

유니티 한영 키 - yuniti han-yeong ki

UNITY 스크립트

유니티 input getKey 한글 우회,한영키 GetKeyDown 수정, GetKeyUp 추가 버전

사용법

1.첨부파일을 받는다

2.프로젝트에 WindowsInput 스크립트를 추가

3. 새 스크립트를 만든 뒤 using WindowsInput; 추가

4. 사용

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using WindowsInput; // << 추가

public class test_key : MonoBehaviour {

void Update () {

if (WindowsInput.WindowsInput.GetKeyDown(KeyCode.A)) Debug.Log("key down");

if (WindowsInput.WindowsInput.GetKeyUp(KeyCode.A)) Debug.Log("key up");

if (WindowsInput.WindowsInput.GetKey(KeyCode.S)) Debug.Log("Key");

}

}

cs

주의

유니티창이 비활성화 되었어도 키가 먹히기 때문에 

void OnApplicationFocus(bool b){} // 게임창이 활성화 되면 true 비활성화 false

를 써서 예방하자

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using WindowsInput; // << 추가

public class test_key : MonoBehaviour {

bool key_window_active;

void OnApplicationFocus(bool b) // 게임창이 활성화 되면 true 비활성화 false

{

key_window_active = b;

}

void Update () {

if(key_window_active )

{

if (WindowsInput.WindowsInput.GetKeyDown(KeyCode.A)) Debug.Log("key down");

if (WindowsInput.WindowsInput.GetKeyUp(KeyCode.A)) Debug.Log("key up");

if (WindowsInput.WindowsInput.GetKey(KeyCode.S)) Debug.Log("Key");

}

}

}

cs

http://byulbram.blog.me/220663468300

유니티 한영 키 - yuniti han-yeong ki

유니티 한영 키 - yuniti han-yeong ki

우분투 12.04에서 한/영 전환키를 누르면 오른쪽 Alt키로 인식해서 한영 전환 후에 곧바로 유니티의 HUD가 작동된다.

차후 업데이트에서 수정되겠지만, 당분간은 다음과 같이 회피한다.

시스템 설정 >

키보드 >

바로가기 >

실행아이콘 >

허드를 표시할 키

를 확인해보면 기본적으로 왼쪽 Alt키로 등록되어 있지만 오른쪽 Alt키도 동작하므로 기존의 단축키와 충돌하지 않는 다른 키로 바꿔준다.

나는 일단 Shift + Super L로 변경. 

* C# API 를 이용해 한/영 키 상태 값 구하기 예제...

유니티 한영 키 - yuniti han-yeong ki
Main

전체 소스 코드

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace CSharp_HangulKeyState
{
    public partial class Form1 : Form
    {
        //API 선언
        [DllImport("imm32.dll")]
        private static   extern IntPtr ImmGetContext(IntPtr hwnd);
        [DllImport("imm32.dll")]
        private static extern bool ImmGetConversionStatus(IntPtr himc, ref int lpdw, ref int lpdw2);


        public Form1()
        {
            InitializeComponent();
            timer1.Start();
        }

        protected override void OnClosed(EventArgs e)
        {
            timer1.Stop();
            base.OnClosed(e);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                IntPtr hIMC;
                int dwConversion = 0;
                int dwSentence = 0;
                bool bCheck;

                hIMC = ImmGetContext(textBox1 .Handle);
                //TextBox 한영키 상태값 얻기...
                bCheck = ImmGetConversionStatus(hIMC, ref dwConversion, ref dwSentence);

                if (dwConversion == 0)
                {
                    label1.Text = "한영키 상태 : 영문";
                }
                else
                {
                    label1.Text = "한영키 상태 : 한글";
                }

            }
            catch
            {}
        }
    }
}
유니티 한영 키 - yuniti han-yeong ki

*예제 결과

유니티 한영 키 - yuniti han-yeong ki
유니티 한영 키 - yuniti han-yeong ki

https://kdsoft-zeros.tistory.com/161

[VBNET] [API] 한/영 키 상태 값 구하기

* VBNET API 를 이용한 한/영 키 상태 값 얻어 오기 예제... 전체 소스 코드 Form1.vb Imports System.Runtime.InteropServices Public Class Form1 'API 선언... Private Declare Function ImmGetContext Lib "i..

kdsoft-zeros.tistory.com

유니티 한영 키 - yuniti han-yeong ki