Unityの忘備録とメモです('◇')ゞ

Unityでゲーム制作中に気づいたことや忘備録とかとか

【Unity】RigBuilderコンポーネントのRigLayersをスクリプトから切り替える!!

ゲーム制作お疲れ様です~( ^^) _旦~~

下の画像の丸印の所をスクリプトでオンかオフに切り替える方法です!


まず、対象のRigBuilderコンポーネントを取得しましょう!

RigBuilder rigBuilder;

 private void Start()
        {
             rigBuilder = GetComponent<RigBuilder>();
         }


そしてどこかの関数の中で下記のように宣言すれば切替ができます!

rigBuilder.layers[0].active = false;


active = falseとすることで指定したインデックスのLayerは非アクティブとなり、
インスペクターでチェックが外れた状態となります!

trueはその逆ですね!

RigBuilderコンポーネントのRigLayersはListになっているので、
インデックスを指定する必要があります('◇')ゞ

インデックスの番号はインスペクターのRigLayersの上から順に0,1・・ となっているので、
一番上のLayerを取得したい場合は0になります。



なぜ外そうとおもったか

アニメーションリギングを使ってIKを設定しプレイヤーに銃を持たせていると、物を拾うなどの手を使うアニメーション再生時も
銃を持っている手のままになってしまいます( ;∀;)

アニメーション再生時に上記をオフに出来れば解決するのでは・・・?

と考えてスクリプトで操作する方法をググりまくったのですがでてこず・・・orz

Layersがリストだと気づいたので自力で解決できました!


最後にスクリプトの全体を載せますね~(^^)
参考までにぃ~

RigBuilder rigBuilder;

 private void Start()
        {
             rigBuilder = GetComponent<RigBuilder>();
         }

 public void EnableRigBuilder(string rigName) //アクティブにする関数
        {
            if (rigName == "LeftHand")
            {
                rigBuilder.layers[0].active = true;
            }
            else if (rigName == "RightHand")
            {
                rigBuilder.layers[1].active = true;
            }
        }

public void DisableRigBuilder(string rigName) //非アクティブにする関数
        {
            if (rigName == "LeftHand")
            {
                rigBuilder.layers[0].active = false;
            }
            else if (rigName == "RightHand")
            {
                rigBuilder.layers[1].active = false;
            }
        }

おわり(^^)

Playerの位置からTargetの方向を求める!!ベクトル同士の引き算【Unity】

ゲーム制作お疲れ様です~( ^^) _旦~~

Playerの位置からターゲットの方向を求める時は、
ベクトル同士の引き算で求められるそうですよ~('◇')ゞ

ターゲットの方向を求めたいときは、


ターゲットの位置 - Playerの位置 = Playerから見たターゲットの方向


という計算で求められます!

例えば~、

Playerがワールド座標でいうところのVector3(x = 5, y = 0, z = -9)にいるとして、
Enemy(ターゲット)はVector3(x = -3, y = 0, z = 3)にいるとしますね。


この時にスクリプトで、

Vector3 direction = enemy.transform.position  -  player.transform.position;
Debug.Log(direction);

で実行してみると、

Vector3(-8, 0, 12); という結果になります。


これはPlayerから見たEnemyの方向を示しているようですね。

いや、PlayerからEnemyへのベクトルが分かる~といった方が
正しいのかもしれないぃ。



~角度を調べる~



Playerの向きに対してのEnemyの角度も計算することができますよ(^^)



2つのベクトルの角度を計算する時は、Vector3.Angleという関数を使うといいみたいです。

Vector3.Angleの引数に、Playerの正面のベクトルと、敵との方向を渡してあげると
角度がわかりますね~(^_-)-☆

youtu.be

Vector3 direction =  enemy.transform.position - player.transform.position;
float angel = Vector3.Angle(player.transform.forward, direction);                        
Debug.Log(angel);

最後に全体のスクリプトを載せますね~('◇')ゞ

using UnityEngine;

public class Test : MonoBehaviour
{
   public GameObject player; //インスペクターからアタッチしてください~
   public GameObject enemy; //インスペクターからアタッチしてください~
   
   void Update()
   {
       Direction();
   }

   void Direction()
   {
        Vector3 direction =  enemy.transform.position - player.transform.position; //方向がわかる
        float angel = Vector3.Angle(player.transform.forward, direction); //角度がわかる
        Debug.Log(direction);
        Debug.Log(angel);
   }
}

寒いので暖かくしてゲーム制作してくださいね~( ^^) _旦~~
おわりです~。

【Unity】Debug.DrawRayに角度をつける

ゲーム制作お疲れ様です~( ^^) _旦~~

Playerの前方に角度がわかるように3本のRayを飛ばします。

真ん中から右に70度、左に-70度とします。

youtu.be

using UnityEngine;

public class Test : MonoBehaviour
{
   void OnDrawGizmos()// OnDrawGizmos()を使うとゲームを実行していなくてもRayが可視化されるようです
   {
      Gizmos.color = Color.blue;                                                //transform.upをプラスしてRayの高さを1にしています
      Gizmos.DrawRay(transform.position + transform.up, transform.forward * 5); //5を掛けることで長さが5になります
      Gizmos.DrawRay(transform.position + transform.up, transform.forward + Quaternion.Euler(0, 70, 0) * transform.forward * 5);
      Gizmos.DrawRay(transform.position + transform.up, transform.forward + Quaternion.Euler(0, -70, 0) * transform.forward * 5);
   }
}

Quaternion.Euler(0, 70, 0)の70の所で角度を調節できます。

ただ角度を可視化したかっただけなのに、
結構ドツボにはまって上記のスクリプトを書くのに1時間くらいかかりました。。。。。

相も変わらずセンスがない(´;ω;`)

transform.fowardにQuatenion.Eulerをそのまま足そうとしてもエラーが出るし、
掛けてもエラーが出るし。。

Quatenion.EulerはVector3型と掛け算した後でないとtransform.fowardに足し算できないっぽいですね(゜-゜)

わからん!!

おわり('◇')ゞ

【Unity】ローカル座標??transform.InverseTransformPointで苦戦したのでメモっとく

transform.InverseTransformPointは引数で渡したオブジェクトの相対的なローカルな座標がわかる関数らしいです。

???

相対的?いまいちわからん(^_-)-☆

たとえば、シーン上にPlayerとEnemyとその子であるEnemyChildがあったとして、

下記のようにスクリプトを作って
Playerにアタッチすると、

Playerの座標を原点としたEnemyChildの座標がわかるみたいですよ( ^^) _U~~

EnemyChildをPlayerの子にした場合のローカル座標とも言い換えられますね。たぶん。

public class Test : MonoBehaviour
{
  public GameObject enemyChild; //Enemyの子オブジェクト

  Vector3 enemyChildLocalPos; //Playerから見たEnemyChildeの座標を保存する変数

  void Update()
  {    
     EnemyChildSearch();
  }

  void EnemyChildSearch()
  {
      enemyChildLocalPos = transform.InverseTransformPoint(enemyChild.transform.position);
      
      Debug.Log(enemyChildLocalPos);
  }
}

実行してみると・・・

EnemyChildの座標がPlayerの位置からVector3(5, 1, 7)の位置にあるのが分かります。

PlayerのX座標を0から5ずらしてみると、、、

EnemyChildの座標も(0, 1, 7)と変化しています。

これはPlayerがEnemyChildの真正面に移動したため、X座標が0になったからですね(^_-)-☆

これ理解するのにかなり苦戦しました。。。

自分のプログラミングセンスねー( ;∀;)

おわり

【3人視点】カメラのカクつきを無くす方法【Unity】

今回カクついた原因
 
RigidBodyがついているPlyerの移動関数をFixedUpdate内で処理しており、
カメラの追従関数はLateUpdate関数で処理していた。
結果的にカクツキが起きました。

試してみて治った方法
 
カメラの追従スクリプトもFixedUpdate内で処理したところ、
カクつきが治りました!!
カメラの関数はPlayerの関数の後に記載するのがポイントです。

   void Fixedupdate()
   {
       PlayerLocomotion(); //Playerの移動関数
       FollowCamera(); //カメラの追従関数
    }

原因

おそらく多分、LateUpdate関数の方がFixedUpdate関数より先に
処理されてしまうっぽいのが原因かも。
Playerの描画処理よりもカメラの処理のが速かったのが
カクつきの原因だと思います!!

と思い少し検証してみた結果がこちら。

あれ??

FixedUpdateのがはやいじゃぁあないか!!

結果は逆でFixedのが速い!!

なんだかよくわかりませんが解決したのでよしとしましょう;

ちなみに前作ったゲームの処理は下記でしたが
カクつきはありませんでした。

    void Update()
    {
       PlayerLocomotion(); //Playerの移動関数
    }

    void LateUpdate()
    {
        FollowCamera(); //カメラの追従関数
    }

今日はこの辺で勘弁してやる(´;ω;`)

ゲームビューを最大化するとフレームレートが激増する謎【Unity】

ゲームを作っている途中で気づいたのですが、
ゲームビューを最大化してる時とそうでない時でキャラクターの移動速度や、
カメラの回転速度にかなり違いが出ていることに気が付きました。

youtu.be

どうやらFPS(フレームレート)なるものにかなりの差が出ているようです。

全画面にしていない時は120FPS付近なのに、全画面だと300オーバー出ています。

これはUnityの仕様なのか、バグなのか、かなり調べたのですがわかりませんでした。

ですが、

たった今この記事を書きながら気づいたのですが、ゲームビューのタブをメインのエディターから切り離してみると
元のFPSの値に戻りましたΣ(・□・;)

なぜこういう仕様?なのかよくわかりませんがとりあえず今後はゲームビューのタブは分けて別のモニターに
表示していこうと思います。

InputSystemのActionMapは切り替えられる

ゲーム制作、お疲れ様です( ^^) _旦~~

InputSystemを使ったゲーム制作において、ゲーム実行中のUI操作中(Startボタンを押してメニューを開いたり等)
にキャラクターも一緒に動いてしまうと困る時ありますよね('◇')ゞ

そんな時はUI操作とキャラクター操作のアクションマップを分けることで解決できるっぽいです。

下の動画では、ゲームパッドの〇ボタンでローリングおよびUIの決定として設定しています。
メニューを開いて決定を押してもローリングはしていませんね。グッド(^^)

youtu.be


キャラクターのジャンプやローリングといったアクション系はPlayerActionsという名前で登録しています。

UIの操作のアクションマップはUIという名で登録します。

EventSystemのインスペクターのActions Assetの項目に現在使っている
InputSystemを選択します。
その下の10項目に対応するアクションマップのアクションを選択すればおkです!

これでキャラクターのアクションとUIの操作を分けることができました。

あとはスクリプトでキャラクターのアクションのON・OFFを切り替えればOKですね(^^)

public class Test : MonoBehaviour
{
   InputActions inputActions;//インプットシステム
   
   void ActionMapDisable()
   {
      inputActions.PlayerActions.Disable();//キャラクターのアクションマップの名前をPlayerActionsにした場合です
                   //Disable()でアクションマップを閉じて使えなくできる
   }
   
   void ActionMapEnable()
   {
      inputActions.PlayerActions.Enable();//Enable()で起動できる
   }