unityのThirdPersonで銃を持たせて構えるエイム動作などを実装してみたメモ

unity 銃 持たせる 構える Unity
※記事内に広告が含まれています。

バーチャル3Dクリエイター神部まゆみです(*^-^*)

この記事はunityのThirdPersonで銃を持たせて構えるエイム動作などを実装してみたメモです。

前回Starter AssetのThird Person Character Controllerをいじってみたので、それに追加して実装してみたいですね。

使用したunityバージョンはunity 2020.3.40です。

アーカイブをダウンロード
アーカイブをダウンロード

追記:エイムカーソルに追従させる方法はこちらの記事で書きました。


●PRスペース●

〇まゆみマート|BOOTH

BOOTHでVRoidテクスチャやVRChat向けオブジェクトなどを販売しています。いいねしてくれると励みになります(*^-^*)

やりたいこと StarterアセットのThirdPersonで、左クリックしたら銃のエイム状態に切り替える

なんかガンシューティング的なやつが作れないかと思ってやってみたいと思った。

左クリックというか、TPSだとL2ボタンとかを押すとエイム状態に移行する感じのが多いか?

とりあえず今回は左クリックしたらアニメーションを銃を構える状態に切り替える感じまでやろうかな。

とりあえずChatGPTに聞いてみる

以前Anystateでアニメーション切り替えるやつやったからあんな感じでできると思うけど。

とりあえずChatGPTさんに聞いてみます。

はい、左クリックをしたら銃や武器を構えるアニメーションに切り替え、構えている最中にもう一度左クリックをしたら攻撃するという仕組みは、一般的なアクションゲームでよく見られる方法です。これにより、プレイヤーは銃を構えて照準を合わせ、必要なタイミングで攻撃することができます。

具体的な実装手順を以下に示します:

左クリックで銃を構えるアニメーションに切り替える:
マウスの左クリックを検出したら、銃を構えるアニメーションに切り替えます。アニメーションはAnimator Controllerを使って制御できます。以下のようにしてアニメーションを切り替えることができます:

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        // 銃を構えるアニメーションを再生
        animator.SetTrigger("Aim");
    }
}

ここで、”Aim”はAnimator Controller内のトリガーパラメータの名前です。これを適切なアニメーションに関連付けてください。

構えている最中に再度左クリックで攻撃する:
構えている最中に再度左クリックを検出したら、攻撃アニメーションを再生し、攻撃を実行します。

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        if (isAiming)
        {
            // 攻撃アニメーションを再生
            animator.SetTrigger("Attack");
            // 攻撃処理を実行
            Shoot();
        }
        else
        {
            // 銃を構えるアニメーションを再生
            animator.SetTrigger("Aim");
            isAiming = true;
        }
    }
}

ここで、isAimingはプレイヤーが銃を構えている状態かどうかを示すフラグです。攻撃アニメーションが終了したら、isAimingをfalseにリセットして、再度銃を構えられるようにしてください。

このような実装により、プレイヤーは左クリックで銃を構え、再度左クリックで攻撃することができます。必要に応じて、アニメーションや攻撃処理をカスタマイズして、ゲームのプレイ感や見た目を調整してください。

おおこれは便利すぎる…。

まぁこれだけだとダメなので細かく聞いたり調べていく必要があるけどね(;^_^A

あとRayCastとか使えばレーザーサイトみたいなのが作れるとか言ってたけど、それは気が向いたら後でやってみます。

しかしアニメーターは既にStarter Assetのやつが設定してあるから、遷移を切り替える感じかな…上手くできるかは不明。

あとはアニメーターとかアニメーションを作ったり設定しないとね。

実際にやってみる

とりあえずアニメーション切り替えるだけならすぐできそうなのでまぁやってみます。

必要なものを用意する

とりあえず

  • 銃のモデル
  • 構えるアニメーション

があればいけるかな?

銃のモデルはVRIFに入ってたからこれを使おうかな。

無料でダウンロードできる銃の3Dモデルとか

アセットストアに良い感じのフリーアセットがあったのでこういうのを使うと良いかも。

Guns Pack: Low Poly Guns Collection | 3D Guns | Unity Asset Store
Elevate your workflow with the Guns Pack: Low Poly Guns Collection asset from Fun Assets. Find this & other Guns options...

Guns Pack: Low Poly Guns Collection – Unity Asset Store

↑のピストルを読み込んだらサイズが巨大だったので、トランスフォームのサイズをXYZ0.1にしたらちょうどよくなりました。あとマテリアルの初期設定もした。

あとはBOOTHで探せば無料の3Dモデルは結構あります。

「銃 3Dモデル」¥0 検索 -BOOTH

まぁ無料アセットはボランティアだからいつなくなっても文句は言えないが…(;^_^A

使い勝手が良ければ作者さんの他の出品物を買ったり、ご支援版を買ったりすると作者さんがやる気を出してアップデートされやすいかもしれませんw

銃はとりあえずhandの子にしておく

↓はVRoidモデルの例だけどこのあたりに配置した。

unity 銃 持たせる 構える

あとは微調整したり、Starter Assetデフォルトのアニメーションの手の部分を調整するしかないかな。

unity 銃 持たせる 構える

どこまでやるか分からないけど、簡単に武器を切り替えるならインスペクターオンオフ切り替えるだけでとりあえずは良いかな。

↓に書いたようなスクリプトなら簡単にできるぶん手軽。

リアルにしたいならホルスターとか銃をしまっておく場所を作っておいて、そこから取り出す動作とかも作ったほうがいいかもしれない。

まぁちょっと動くものを作ってみたいだけだし、そこまでは求めません。

アニメーションを作る

とりあえず1フレームだけのポーズだけでいいかな。

瞬きくらいはさせてもいいけど、下手に動かすとエイムがずれてウザそうw

unity 銃 持たせる 構える

ポーズはVeryAnimationで作りました。

Very Animation|Unity Asset Store

とりあえず動かすには十分だと思うのでこれでいきます。

作ったエイムのアニメーションファイル配布

私はしばらく使わないファイルを消してしまう主義なので、バックアップがてらここにエイムのアニメーションファイルを置いておきます。

https://knb-mayumi.com/wp-content/uploads/2024/07/Aim.zip

VRoidでしか動作テストしてないですがHumanoidなら大抵は動くんじゃないかな?

まぁポーズだけだから大したファイルではないけどね(;^_^A

アニメーター遷移を作る

Aimしてるかを取得するBool型のパラメーターを作って、Idle Walk Runから伸ばした。

unity 銃 持たせる 構える

Anystateからでもいけるけどジャンプ中とかもできてしまうのであまり良くない。

遷移の説明

左クリックを押してAimがtrueになり(後述するスクリプト参照)、なおかつGroundedがtrueの場合(ジャンプしてない)の時にAimアニメーションに遷移する。

Groundedを指定しないと空中でも構えてしまった。

unity 銃 持たせる 構える

↓AimとJumpがFalseになったら元の状態に戻す。

エイム中にジャンプしたらJumpStartに遷移するようにしてあるので、それが終わったら戻す感じ。

unity 銃 持たせる 構える

Jump false以外の条件だと遷移が少しおかしくなったけど、スクリプトや他の条件次第かもしれない。

JumpしたらJumpStartに遷移する。

これはAimがtrueならジャンプ無効にすれば必要ないかもしれない。

unity 銃 持たせる 構える

スクリプトを書く

ChatGPTに聞きつつ調べつつやったけど一応ちゃんと動いた。

事前にThirdPersonのStarterAssetsを入れておく必要があるけど、そのあたりの手順は前回の記事を参照。

Aim.cs

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

public class Aim : MonoBehaviour
{
    public Animator animator;
    private ThirdPersonController thirdPersonController;

    // Start is called before the first frame update
    void Start()
    {
        thirdPersonController = GetComponent();
    }

    // Update is called once per frame
    void Update()
    {
        //左クリックしたうえでAimがFalseならtrueに、trueならfalseに
        if (Input.GetMouseButtonDown(0) && !animator.GetBool("Aim"))
        {
            // 銃を構えるアニメーションを再生
            animator.SetBool("Aim",true);
        }
        else if (Input.GetMouseButtonDown(0) && animator.GetBool("Aim"))
        {
            // 銃を構えるアニメーションを終了
            animator.SetBool("Aim", false);
        }
        
        //ジャンプしたらAimをFalseに
        if(animator.GetBool("Jump")) animator.SetBool("Aim", false);

        //エイムがtrueならMoveSpeedを0に、falseなら元の速度に戻す
        if (animator.GetBool("Aim"))
        {
            thirdPersonController.MoveSpeed = 0f;
        }
        else
        {
            thirdPersonController.MoveSpeed = 2.0f;
        }
    }
}

使い方

ThirdPersonControllerをつけたモデルに追加して、アニメーターだけD&Dしたりして指定してやればOK。

unity 銃 持たせる 構える

最初やったら構えながらでも動けてしまったので、ThirdPersonControllerのMoveSpeedを0にして動かなくした

ここを0にしたら動かなくなったので、Aimがオンの間は0にした。

コードのここのところね。

//エイムがtrueならMoveSpeedを0に、falseなら元の速度に戻す
if(animator.GetBool("Aim"))
{
    thirdPersonController.MoveSpeed = 0f;
}
else
{
    thirdPersonController.MoveSpeed = 2.0f;
}

できた!

無事切り替えられた!

unity 銃 持たせる 構える

単に静止しただけのポーズでも最低限の動作はするみたいですね。

とりあえずアニメーションの切り替えはできたけど、エイム中は固定化して前方にカメラを持っていく感じにしたほうがいいかな。

それで精密にエイムできるようにカメラをコントロールしたほうがいいでしょう。

まぁある程度やりたいところまではできたので余裕があれば続きをやります。

気になった点:遷移が粗ぶったのでFootIKをオフにした

ここにチェックがついてたら粗ぶってしまった。

unity 銃 持たせる

これだと足が荒ぶる。

unity 銃 持たせる 構える

オフにしたら大丈夫だった。

unity 銃 持たせる 構える
unity 銃 持たせる 構える

とりあえず今のところ不具合はないのでこれでやってみます。

つづく?

ChatGPT使いつつやってるけど案外できますね。

しかしunityやC#の基礎知識がないと具体的な質問ができないので、ある程度知識はあったほうがいいかも。

言われたままやると「良く分からないけど動いた!」で終わりそうだから勉強しつつやっていきます。

ChatGPTもたまに変なこというからね(;^_^A

まぁぼちぼちいじってみます(*^-^*)

2023/11/02追記:右クリック押してる間はエイム、右クリック離したら解除、に書き換えた

steamで買ったTPSをいくつか試してみたらこっちの操作方法が一般的だったので書き換えてみました。

これからコントローラーに割り当てる時もL2とかにすればいいかも。

例のごとくChatGPT氏にやってもらった(笑)。

unity 銃 持たせる 構える

ChatGPTも一から指定する場合は、意図しない動作をするスクリプトを返してきたりして試行錯誤する必要があったりするけど、既存のコードを書き換える指定だと精度が高い気がする。

まぁ私の使い方が悪いのかもしれないけど、上手く使うには使う側の歩み寄りもかなり必要な印象(;^_^A

書き換えたコード

こんな感じ。

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

public class Aim : MonoBehaviour
{
    public Animator animator;
    private ThirdPersonController thirdPersonController;

    // Start is called before the first frame update
    void Start()
    {
        thirdPersonController = GetComponent();
    }

    // Update is called once per frame
    void Update()
    {
        //右クリックが押されている間はエイムモード
        if (Input.GetMouseButton(1))
        {
            // 銃を構えるアニメーションを再生
            animator.SetBool("Aim", true);
            // MoveSpeedを0にすることで移動を停止
            thirdPersonController.MoveSpeed = 0f;
        }
        else
        {
            // 右クリックが離されたらエイムモードを解除
            animator.SetBool("Aim", false);
            // MoveSpeedを元の速度に戻す
            thirdPersonController.MoveSpeed = 2.0f;
        }
    }
}

動かしたいモデルにスクリプトをアタッチして、モデルのアニメーターを指定する。

unity 銃 持たせる 構える

当然ながら事前準備として、Aim変数を定義しておいたりページ上で書いたような遷移を作ったりしておく必要があります。

追記終わり。

次はエイムカーソルを作ったり、エイム中にキャラが旋回しても追従していくようにしてみようかな。


追記:続きを書きました!


2024/07/19追記:使ったファイルをまとめてアップしておきます

久々に動かそうと思ったらファイルがどこに行ったか分からなくなったので、面倒なのでここにzipファイルをまとめて置いておきますw

タダなので動作保証はできませんが勝手に参考にしてください。

https://knb-mayumi.com/wp-content/uploads/2023/10/AimFiles.zip

事前にStarter Assetsのセットアップを済ませておく必要があります。

①解凍したzipに入っているアニメーターコントローラーとAim.csをモデルにアタッチする

②Aim.csにモデルのアニメーターを設定する

③アニメーターのAimのMotionにAimアニメーションファイルを設定する

でOK。

動画は↓。

また何かあれば追記します(*^-^*)

タイトルとURLをコピーしました