見出し画像

[unity]ハードウェアで銃とか剣の位置ををちょちょいのちょいと調整としよう

 unityで3Dアクションゲームを作るとき、銃や剣の位置調整って意外と面倒だと思います。
 たとえば銃の位置調整は、positionとrotationの両方を調整しなければなりませんが、できればアニメーション動かした状態でぴたりの位置に調整したいですよね。

銃をアタッチした位置
アニメーションさせた場合の位置

そこで、これを動かしてみながら調整するのにぴったりのアイテム「MIDIコントローラー」がありますので紹介いたします。

今回使用したMIDIコントローラはnanoKONTROL Studioです。スライダーとノブとボタンがたくさんついてます。このスライダーの値などをMIDI Jackというアセットでunityに取り込んでみます。

使い方は、Hikoさんの記事を参考にさせていただきました。

実際に調整する様子はこんな感じになります。スライダーで位置を調整し、ノブで回転を調整しています。

ソースコードです。適当なObjectにアタッチして使います。

using UnityEngine;
using MidiJack;

public class MidiDebugger : MonoBehaviour
{
    public Transform targetTransform;
    public Transform cameraTransform;
    public Transform playerTransform;

    private Vector3 targetPositionRoot;
    private Vector3 targetAngleAdj;
    private Vector3 cameraPositionRoot;

    private Vector3 positionAdj = new Vector3(0, 0, 0);


    void Start()
    {
        targetPositionRoot = targetTransform.localPosition;
        cameraPositionRoot = cameraTransform.position;
    }


    void Update()
    {

    }

    private void OnEnable()
    {
        MidiMaster.noteOnDelegate += NoteOn;
        MidiMaster.noteOffDelegate += NoteOff;
        MidiMaster.knobDelegate += KnobOn;
    }

    private void OnDisable()
    {
        MidiMaster.noteOnDelegate -= NoteOn;
        MidiMaster.noteOffDelegate -= NoteOff;
        MidiMaster.knobDelegate -= KnobOn;
    }

    private void NoteOn(MidiChannel channel, int note, float velocity)
    {
        //Debug.Log("NoteOn: " + channel + ", " + note + ", " + velocity);
    }

    private void NoteOff(MidiChannel channel, int note)
    {
        //Debug.Log("NoteOff: " + channel + ", " + note);
    }

    private void KnobOn(MidiChannel channel, int knob, float value)
    {
        if (channel == MidiChannel.Ch1 )
        {
            // knob & value
            switch (knob)
            {
                case 2: // slider 1
                    positionAdj.x = (value - 0.5f);
                    break;
                case 3: // slider 2
                    positionAdj.y = (value - 0.5f);
                    break;
                case 4: // slider 3
                    positionAdj.z = (value - 0.5f);
                    break;
                case 12: // slider 8
                    cameraTransform.position = new Vector3(cameraPositionRoot.x, cameraPositionRoot.y, cameraPositionRoot.z + (value -0.2f) * 5.0f);
                    break;
                case 13: // kbob 1
                    targetAngleAdj.x = value*360;
                    break;
                case 14: // knob 2
                    targetAngleAdj.y = value*360;
                    break;
                case 15: // knob 3
                    targetAngleAdj.z = value * 360;
                    break;
                case 20: // knob 8
                    playerTransform.eulerAngles = new Vector3(0, value * 360, 0);
                    break;
                default:
                    break;
            }
            targetTransform.localPosition = targetPositionRoot + positionAdj;
            targetTransform.localEulerAngles = targetAngleAdj;
        }
    }
}

改造して使用されることを前提としています。
このままでは使いづらいと思います。

設定項目

Target Transformに位置を調整する銃あるいは剣のアセットをセットします。
Camera TransformにセットしたカメラのZ位置をスライダー変更できるようになります。環境にあわせて操作軸を調整してください。
Player Transformに武器を持たせるキャラクターのrootをセットします。ノブで左右回転すりょうになり、いろんな方向から調整できるようになります。

調整したら、PositionとRotationをコピーしておいてください。確認動作を停止させてからペーストして完成です。

決めた値のコピーをわすれずに

MIDIコントローラは、今回の用途にかぎらずゲーム開発のいろいろな場面で使えるのではないかと思います。
特に、レベルデザインではいろいろ調整できて便利そうですね。

注意) MIDIコントローラはスライダーやノブの最初の位置を検出できません。スライダーやノブを動かした瞬間にリアル値が入ってきます。これは仕様ですので回避できません。

今回使用させていただいたアセットです。プロ意識高いTenebroさんかわいい。いしかわさんの銃は見栄えがよく、オプションが山ほどあってマニアックです。(オプションだけ先に買っちゃってますが本体も買いますね)

簡単ですが、今回はここまでです。
Hikoさんとkeijiroさんのおかげで、やりたいことが簡単に実現できました。感謝します。

ではまた。ゲーム制作者魂がともにあらんことを。(k1t)

この記事が気に入ったらサポートをしてみませんか?