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

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

【Unity】デバッグを実行した時にゲームビューがフォーカスされちゃって鬱陶しい時の対処法

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

デバッグした時、ゲームビューが勝手にフォーカスされてうっとうしかったのでメモしておきます('◇')ゞ

特にモニターが1台の方にはお勧めです。

ゲームビューの上部にあるタブからデバッグ時の挙動を変更する事が出来ます。

PlayFocusedにするとデバッグ時にゲームビューがフォーカスされます。(初期の状態)

Playmaximizedはデバッグ時にゲームビューが最大化した状態でフォーカスされます。

PlayUnfocusedはデバッグ前にフォーカスしていたタブのままデバッグが実行されます。

知っている方も多いかと思いましたがお役に立てると嬉しいです('◇')ゞ

おわり(^^)

【Unity】初めて作ったフリーゲームがゲーム実況動画になってて嬉しかったお話【自作ゲーム/Freem】

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

今日はただの自分語りですがよければ見ていってくださいな('◇')ゞ

2023年に初めてUnityを触って、その年の8月にストアに無料で
ゲームを出しました(^^) (途中2か月ほど挫折して中断していた時期あり)

出したゲームの詳細は
〇一人称視点
〇悪魔(素材はUnityちゃん)と制限時間まで鬼ごっこ
〇使用素材はすべて無料のもの
〇Freemにアップロード

Unityを始めた当初はまさか自分のゲームを世の中に出すなんて微塵も思っていなかったので、
ストアにアップロードした時はかなり達成感がありました(^^)

最初にFreemという、無料ゲームサイトではもっとも有名なサイトに出しました。

それから何日かした後、ふと思ったのです(゜-゜)

「ゲーム実況動画、投稿されてないかな??」

でも初めて作ったゲームだし、まずダウンロードしてくれてる人がいるかも
分からないのに実況動画なんて上がっているわけがないよね....

なんて思いながらYoutubeでゲーム名を入れると、
なんと4人の方がすでに実況動画を上げてくれていました!!!

最初動画を見つけた時は心拍数が急上昇したのをめちゃ覚えています(;'∀')

中には動画が6千回以上再生されている物もあり、自分の予想を遥かに遥かに上回る結果でした。

初めて作った、しかも途中挫折しまくっても何とか完成させたゲーム...
それが多くの方に動画として楽しんで頂けていると知って、嬉しさで心臓がバクバクになったのを覚えています(笑)

最初に見つけた実況動画は下記です(^^)

youtu.be

見つけた時は嬉しさと緊張で思考停止になりました(笑)
いざ動画クリック!!!

自分のゲームが実況されるのってめっちゃ恥ずかしいですねw
何よりバグが出ないでくれ~と祈りながら見ていましたww

動画を見ていく中で感じたこと

①スタック(Playerが段差などに引っかかっちゃう)をちゃんと修正すべきだった!! ←製作中はまあ大丈夫でしょう程度に思っていた
②ゲームに思わぬバグがあった!! ←敵が意図しないところにワープしてしまう
③最後の最後まで遊んでもらえた ←これが一番嬉しかった!!!
④アイテムの使い方の説明をもっと詳細にすべきだった
⑤ストーリーをもっとしっかり作ればよかった

⑥自分の知らない進行不能バグが出なくてよかった ←これを一番恐れていたw

動画を投稿してくれた方の中には4時間以上プレイして最後まで(調子に乗って作った隠しステージも全部)クリアしてくれた方もいて、
ゲームを完成させて本当に良かったと思いました。

製作中は自分以外の人にゲームをプレイしてもらわなかったので、
感想を言ってもらえてとても参考になりました。

特に④のアイテムの使い方の説明をもっと詳細にすべきの項目。
プレイした方のほとんどが「使い方わからーん」と言っていたので
参考になりまくりでした!!次に活かします('◇')ゞ

まとめ
自分1人だと気づけない事が分かる!!
そしてなにより実況動画が出ると活力が沸きますね!!!

動画主の皆様、感謝です!!!

以上!!
おわり(^^)

【Unity】Rigコンポーネントをスクリプトで取得する方法

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

上の赤丸の部分をスクリプトで取得して数値を変える方法です('◇')ゞ

まず名前空間の外側に下記を宣言します。

using UnityEngine.Animations.Rigging;

これを宣言するとRig関係のコンポーネントスクリプトで取得できるようになるみたいですね。

次に操作したいRigを取得します。

public Rig rig; //インスペクターから取得

最後に関数の中で下記を宣言すればRigのウエイトをスクリプトで変えることができます。

public void RigOn()
{
  rig.weight = 1;
   
}

public void RigOff()
{
  rig.weight = 0;
}

最後に全文を載せます('◇')ゞ

using UnityEngine;
using UnityEngine.Animations.Rigging;

public class Test : MonoBehaviour
{
   public Rig rig; //インスペクターから取得
   
   public void RigOn()
   {
      rig.weight = 1;
   
   }

   public void RigOff()
   {
       rig.weight = 0;
   }
}

おわり(^^)

【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になったからですね(^_-)-☆

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

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

おわり