キーボードFX
キーボードフラグ
押すFX.A
離すFX.Aのように使う
押したり離されたりすると、FixedUpdateが実行されるまでtrueのままになる。
FixedUpdateが実行されるとfalseに戻る。
FixedUpdateはUpdateと呼ばれるタイミングが違うので押す.Aや離す.Aではうまくいかない。
FixedUpdateのプログラムに使う用の押すFX.Aや離すFX.A
プログラム最初に実行(入力)
using System.Collections.Generic;
using UnityEngine;
public class キーボードFX: MonoBehaviour
{
void Start()
{ ボタン入力管理.初期化(); }
void Update()
{ボタン入力管理.更新();}
}
public static class 押すFX
{
public static bool A, B, C, D, E, F, G, H, I, J,
K, L, M, N, O, P, Q, R, S, T,
U, V, W, X, Y, Z;
public static bool スペース, エンター;
public static bool 上, 下, 左, 右;
public static bool 左クリック, 右クリック, 中クリック;
public static bool ホイール上, ホイール下;
}
public static class 入力FX
{
public static bool A, B, C, D, E, F, G, H, I, J,
K, L, M, N, O, P, Q, R, S, T,
U, V, W, X, Y, Z;
public static bool スペース, エンター;
public static bool 上, 下, 左, 右;
public static bool 左クリック, 右クリック, 中クリック;
}
public static class 離すFX
{
public static bool A, B, C, D, E, F, G, H, I, J,
K, L, M, N, O, P, Q, R, S, T,
U, V, W, X, Y, Z;
public static bool スペース, エンター;
public static bool 上, 下, 左, 右;
public static bool 左クリック, 右クリック, 中クリック;
}
public static class ボタン入力管理
{
static Dictionary<string, KeyCode> 対応表 = new Dictionary<string, KeyCode>()
{
{"A", KeyCode.A}, {"B", KeyCode.B}, {"C", KeyCode.C}, {"D", KeyCode.D},
{"E", KeyCode.E}, {"F", KeyCode.F}, {"G", KeyCode.G}, {"H", KeyCode.H},
{"I", KeyCode.I}, {"J", KeyCode.J}, {"K", KeyCode.K}, {"L", KeyCode.L},
{"M", KeyCode.M}, {"N", KeyCode.N}, {"O", KeyCode.O}, {"P", KeyCode.P},
{"Q", KeyCode.Q}, {"R", KeyCode.R}, {"S", KeyCode.S}, {"T", KeyCode.T},
{"U", KeyCode.U}, {"V", KeyCode.V}, {"W", KeyCode.W}, {"X", KeyCode.X},
{"Y", KeyCode.Y}, {"Z", KeyCode.Z},
{"スペース", KeyCode.Space},
{"エンター", KeyCode.Return},
{"上", KeyCode.UpArrow},
{"下", KeyCode.DownArrow},
{"左", KeyCode.LeftArrow},
{"右", KeyCode.RightArrow},
{"左クリック", KeyCode.Mouse0},
{"右クリック", KeyCode.Mouse1},
{"中クリック", KeyCode.Mouse2},
};
public static void 初期化()
{
foreach (var name in 対応表.Keys)
{
設定(typeof(押すFX), name, false);
設定(typeof(入力FX), name, false);
設定(typeof(離すFX), name, false);
}
設定(typeof(押すFX), "ホイール上", false);
設定(typeof(押すFX), "ホイール下", false);
}
public static void 更新()
{
foreach (var 項目 in 対応表)
{
string 名 = 項目.Key;
KeyCode コード = 項目.Value;
if (Input.GetKeyDown(コード)) { 設定(typeof(押すFX), 名, Input.GetKeyDown(コード)); }
if (Input.GetKey(コード)) { 設定(typeof(入力FX), 名, Input.GetKey(コード)); }
if (Input.GetKeyUp(コード)) { 設定(typeof(離すFX), 名, Input.GetKeyUp(コード)); }
}
float wheel = Input.GetAxis("Mouse ScrollWheel");
bool 上 = wheel > 0f;
bool 下 = wheel < 0f;
if (上) { 設定(typeof(押すFX), "ホイール上", 上); }
if(下)設定(typeof(押すFX), "ホイール下", 下);
}
static void 設定(System.Type t, string 名, bool 値)
{
var field = t.GetField(名);
if (field != null)
field.SetValue(null, 値);
}
}
プログラムFixedUpdateの最後に実行(リセット)
Updateは上の物体のプログラムから実行されるがFixedUpdateはそうではないみたい。
Edit → Project Settings → Script Execution Orderからプログラムの順番を設定する
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class キーボードFX最後 : MonoBehaviour
{
void Start()
{ }
void FixedUpdate()
{
ボタン入力管理.初期化();
}
}

