Unitytipsまとめ記事~unityの小技やテクニック集~

Unity

ここでは、Unityの小技やテクニック集をまとめています。 

少しずつ追加していく予定です。 

よくあるエラー集

・大文字と小文字の間違い
・スクリプト名とクラス名の不一致 

・ 2D用と3D用がある コライダーやコリジョンなど 

・ クラスの二重定義   例 class NewBehaviourScript など 

・  同じファイル、フォルダ名にも注意

・NullReferenceExceptionが最も多い Nullの場合は中身をチェックする 

  エラー対策

・コピペして調べる

・Dedeg.Log();で確認をすること

・バックアップをとる GitHubやコラボレート機能など  

   エラーが出ないエラーの場合は コンポーネントやインスペクターを
 重点的にチェックする。

プレーンに動画を貼り付ける方法

今回は、プレーンに動画を貼り付ける方法を見ていきます。 

これは非常に簡単です。 

予めプレーンと動画ファイル【mp4の動画】を入れておいて 

その動画をプレーンにドラッグするだけです。 

動画を入れますと、インスペクターに

videoPlayerが追加されるので そこで再生速度などの設定ができます。 

プレーンに入れるとおそらく向きが逆になっているので 

プレーンのY軸を180度変えてあげればOKです。 

再生すると、このように動画が再生されていますね。

2D用のワープポイント 

2D用のワープのサンプルスクリプトです。 

ポイントとしては、 2Dなのでポジションはvector2にして 

OnTriggerEnter2D(Collider2D other)を使うことです。 

今回はトリガーが必要なので 

ゴールとかオブジェクトに イズトリガーをつけて 

このスクリプトを貼っていきます。 

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

public class WarpPoint : MonoBehaviour
{
    public Vector2 warpPoint;
    private Vector3 target;

    

    void OnTriggerEnter2D(Collider2D other)
    {
        target = other.gameObject.transform.position;
        target.x = warpPoint.x;
        target.y = warpPoint.y;
        other.gameObject.transform.position = target;
    }
}

オブジェクトは重ねてはいけない  

こちらの画像は2Dで壁を作っていますが 

この状態で再生してみると、 以下の画像のように 

ぐちゃって なってしまう。 

これは、オブジェクト同士が重なっていると起こる現象なので 

重ならないように設置するのがコツです。

ボタンが反応しない時の対処法 

unityroomなどでゲームをアップすると 

ボタンが反応しないことがあります。 

原因としては、主に2つあります。 

・シーンにイベントシステムが入っていない 

・ボタンの手前に他のオブジェクトが入っている

これは画像のように キャンバスのすぐ下にボタンが入っていないと

だめということです。 

順番としては、ボタンが一番上になります。

 






2D用の移動スクリプト 

2D用のコントローラーサンプルです。

これで操作ができます。 

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

public class Con1 : MonoBehaviour
{
    public float speed = 10.0F;



    void Update()
    {
        var h = Input.GetAxis("Horizontal");
        var v = Input.GetAxis("Vertical");

        
        Vector2 direction = new Vector2(h, v).normalized;


        GetComponent<Rigidbody2D>().velocity = direction * speed;


    }
}

オブジェクトを透明にする方法 

今回はオブジェクトを透明にする方法を見ていきましょう。 

これも簡単にできます。 

まずは、プロジェクトからマテリアルを作ります。 

そして、Renderingmodeを Fadeに変更します。 

そして、アルベドをクリックしてアルファ値【A】を 

0にします。  

あとは、このマテリアルをドラッグすれば透明になります。 

下の画像だと、プレーンが透明になっていて 

その上に、キューブがある状態です。 

透明は何かを隠したいときに結構よく使いますからね。

衝突判定の基本 

衝突判定で覚えておくべきことは以下の6つです。 

・OnCollisonEnter

オブジェクト同士が衝突した時に発生します。

【ぶつかるオブジェクトにコライダーやリジッドボディをつける

 必要があります】

・OnCollisonExit 

オブジェクト同士が離れた時に発生します。 

・OnCollisonStay 

オブジェクト同士が衝突している間は 発生します。 

・OnTriggerEnter 

コライダーが他のトリガーイベントに衝突する時に発生します。 

・OnTriggerExit 

コライダーが他のトリガーイベントから離れた時に発生します。 

・OnTriggerStay 

トリガーが他のコライダーと衝突している間は 発生します。

コライダーとトリガーは機能的にはほぼ同じですが。 

設定方法が少し違います。 

トリガーを使う場合は、 衝突する側に 

コライダーとIs Triggerをつける必要があります。 

使い分ける方法ですが、範囲の中に入る場合などは 

トリガーを使っていくことが多いです。

あとは、ワープポイントを作る場合なども 

トリガーで設定していきますね。 

Cloth機能を使ってみよう 

今回は、Cloth【クロス】機能の使い方を見ていきます。 

クロス機能は知ってますかね? 

オブジェクトを布のような動きにすることができる機能です。 

これを使えば 

キャラクターの髪の毛をゆらゆらしたり 

動物の尻尾をゆらゆらしたり 

ラーメン屋の暖簾をゆらゆらしたり

カーテンをひらひらしたりできるわけです。 

それでは、今回はプレーンをゆらゆらしていきます。 

まずはプレーンを入れて

インスペクターにある Meshcolliderの凸状にチェック

そしてトリガーにも、チェックを入れます。 

そして コンポーネントを追加から 

Clothを入れます。 

Clothを入れると、自動的にskinnedも入ります。

で次にですね。 

Clothの右下にある緑矢印のアイコンを選択します。 

そうすると、 シーンビューにクロスのセルフコリジョンというメニューが 

出てくるので、 そこで選択を選びます。 

そして、 囲みたい所をドラッグして選択していきます。 

そして囲んだら すぐ下にある 

セルフコリジョンとインターコリジョンにチェックを入れます。 

この画像ですと、 プレーンの上側だけを囲んでいます。 

囲む所は、固定したい所になります。 

囲んだ所は青い点に変わります。

つまり、囲んでいない所がゆらゆらするということです。

ではこれで再生してみましょう。 

この状態でプレーンを動かしてみると 

画像のように、 プレーンが ゆらゆらしていると思います。 

このようになっていれば成功です。 

※注意点としては、 1回囲んでしまうと、ポインターが消えてしまうので 

また設定をやり直す必要があるんですよね。 

Reflectionprobeを使ってみよう 

ここでは、リフレクションプローブの使い方を見ていきます。 

略してリフプロは、周囲のあらゆる方向の球面図をキャプチャできるものです。 

それを利用すれば、 鏡のような反射オブジェクトを作れます。 

まずは下準備として 

プレーンとキューブと Unityちゃんを入れておきます。 

【キャラクターならなんでもOK】

キューブは長方形にして、 Unityちゃんの前に配置しておきましょう。 

次にマテリアルを作ります。 

マテリアルのインスペクターで 

メタリックとスムースレスを1にします。 

そして、マテリアルをキューブに貼り付けていきます。 

では次に 空のゲームオブジェクトを作って 

コンポーネントを追加から、Reflectionprobeを入れていきます。 

設定は画像のようにしていきます。 

タイプはリアルタイム 

解像度は、1024

HDRにチェックを入れます。 

あとは、キューブのサイズや位置を微調整すれば 

Unityちゃんが反射しているように見えます。

表示と非表示のサンプルプログラム 

こちらのプログラムはもし Playerタグと当たったら 

オブジェクトを表示するというプログラムです。 

表示する場合は、true 

非表示する場合は、falseを入れます。 

今回は、OnTriggerEnterを 使っているので 

オブジェクトには、イズトリガーを入れる必要がありますね。 

using UnityEngine;
using System.Collections;
 
public class Wall : MonoBehaviour {
 
    public GameObject ball;
 
    void OnTriggerEnter(Collider other){
        if(other.gameObject.CompareTag("Player")){
 
            ball.SetActive(true);
        }
    }
}

太陽を動かす方法 

太陽を動かすには、 DirectionalLightを動かしてあげれば 

連動して、 太陽も動きますので。 

DirectionalLightに 以下のようなスクリプトをつけると 

太陽が回って、24時間の動きになります。 

X軸だけ変えてればOKです。 中の数字はお好みで設定してください。

using UnityEngine;
using System.Collections;

public class San : MonoBehaviour {

	void Update () {
		
		this.gameObject.transform.Rotate(new Vector3(12, 0, 0) * Time.deltaTime);
	}
}

コンポーネントをコピーする

既にご存知かと思いますが、 コンポーネントは 

コピーして、貼り付けもできます。 

・・・ の所をクリックすると、 コンポーネントをコピーができます。 

これのほうが、いちいち設定しなくていいので 楽になりますね。

プレビューパッケージを使う方法

編集から プロジェクト設定を開きます。 

そして、 パッケージマネジャーを開いて 

プレビューパッケージに チェックを入れると 

プレビュー版も使えるようになります。 



またはプレビューパッケージ一覧から 
URLをコピペして
PackageManager→ Add package from URLの所に貼り付けても利用できます。

再生モードを早くする方法 

編集からプロジェクト設定を開きます。 

エディターを開いて、 再生モードの開始時オプションにチェックを入れます。 

これをすることで、 再生モードがかなり早くなるので 

重たいアセットでも、すぐにプレイすることができます。 

重たいアセットで試してみるとわかりますが 

5倍ぐらいスピードが違います。

これは必須の設定なので、 必ずONにしておきましょう。

日本語フォントを使う方法 

では今回は、日本語フォントを使う方法です。  

まずは、好きな日本語フォントをダウンロードしましょう。 

日本語フォント フリーと検索すれば色々出てきます。
フォントはそれぞれ利用規約が違うので
ちゃんと確認をしておきましょう。

日本語フォント一覧はこちら 

Unityを開いたら、ヒエラルキーの所から 

UI→ テキストを入れましょう。

そして、インスペクターのテキストで
文字を入力します。 今回は こんにちはと 入れています。 

デフォルトだと、 arialというフォントになっていますが。 
これは日本語だと非常に見づらくなってしまうので 
やはり日本語を使う場合は、 日本語フォントに変えたほうがいいですね。 

では次に、 ダウンロードした 日本語フォントを
Unityにインポートしましょう。 

フォントのやつをドラッグ&ドロップしてプロジェクトに入れていきます。 

そしたら 今入れたフォントをドラッグして 
インスペクターにある、フォントにドロップしましょう。 

これで日本語フォントが使えます。  
非常にかんたんですね。

今回入れたフォントは、 tenhamasenフォントです。
少し丸みのあるフォントですね。

アセットストアの使い方 

アセットストアもですね。 2020.1vr以降だとやりかたが異なっているので
注意です。 

2021.1以降でアセットストアを開くとこのようなページが出てきます。 

まずUnity内でアセットの検索が出来なくなって。
アセットストアで検索する場合は、ブラウザで開く形になりました。

そして、購入したアセットは 
パッケージマネージャーで管理をします。
ですので、パッケージマネージャーのマイアセットから
インポートする形になりました。 

私も正直,前の方がよかったですけど。
こればっかりはしょうがないですね。




Terrainを軽くする方法 



Terrainはデフォルトのままで使用するとかなり重たいので 
ちゃんと設定をする必要があります。 
ここではおすすめの設定などを紹介します。

ピクセル許容誤差はデフォルトだと 5になっていますが
軽さを重視するなら20~40程度にするのがいいです。

ベースマップ距離も値を小さくすればするほど軽くなります。
ただ小さくすると解像度も下がってしまうので 
そのへんの微調整が大事です。

Terrainでフィールドを作る場合は 
なるべく平坦を多くする、そして木や草などもなるべく最小限にすることです。
あとはフィールドサイズも大きくしすぎないことが大切です。

簡単シーン遷移 

こちらを使えば簡単にシーン遷移が出来ます。

https://github.com/naichilab/Unity-FadeManager/blob/master/README.ja.md

モデルプレハブについて 

モデルプレハブとは、fbxをインポートすると自動的に生成されるものです。
黒と青色のプレハブが、モデルプレハブになります。

下の画像だと
・safetygogles
・workshopset の2つがモデルプレハブです。

これは編集が出来ないプレハブになります。
Unity内での編集は出来ませんが 
元の3Dソフトの方で編集をした場合は、
モデルプレハブも更新される形になります。

インプットシステムでエラーが出るときの対処法 

Unityでこのようなエラーが出ることが多いですが。↓

これは設定で解決することが出来ます。 

InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings.

編集→プロジェクト設定→プレイヤー→その他の設定→赤枠の部分を両方にします。

インプットシステムは新旧両方に対応できたほうがいいので 

この設定をデフォルトにしておきましょう。 

レンダリングパイプラインについて 

現在Unityで使われているパイプラインは3種類あります。
ビルトインRP、URP、HDRPです。

   URPの特徴
・描画処理が軽い
・どのプラットフォームでも使える

・2Dゲーム、モバイルゲーム向き
・Shader Graph、VFX等が使える  

    HDRPの特徴
・UE並みのグラフィックに出来る
・リアルな表現に出来る
・3Dゲーム向き
・負荷処理が重たい【スペックの高いゲーミングPCじゃないとキツイ】
・Shader Graph,VFX等が使える        

ビルトイン【通常】RPの特徴

・古いアセットでも互換性がある
・URPと比べると処理が遅い。

・Shader Graph、VFX等が使えない

オブジェクトをズームさせる方法 

今回は、マウスのホイール操作で
オブジェクトをズームさせる方法になります。

スクリプトはこちら 

using UnityEngine; 
public class Zoomer : MonoBehaviour 
{ 
    public GameObject targetObject; 
    public float zoomSpeed = 1; 
    private Camera mainCamera; 
    void Start() 
    { 
        mainCamera = Camera.main; 
    } 
    void Update() 
    { 
        var scroll = Input.mouseScrollDelta.y; 
        targetObject.transform.position += mainCamera.transform.forward * scroll * zoomSpeed; 
    } 
}

スクリプトが出来たら、メインカメラにアタッチをします。 

あとは、インスペクターからターゲットオブジェクトで
対象の【ズームしたい】ゲームオブジェクトを入れればOKです。

それで再生をして、マウスのホイールを動かすと
オブジェクトがズームイン、ズームアウト出来ます。

【インプットシステムのエラーが出る場合は、上記の方法で設定してください】

画面を真っ暗にする方法 

Scene画面を真っ暗にするには

Directional lightのX軸を210~330程度にすると 

真っ暗になります。 

他にも色々方法はありますが、lightの調整が一番簡単です。

パッケージのエラー

このようなエラーが出たときの対処法 

An error occurred while resolving packages:
Project has invalid dependencies:
com.unity.shadergraph: Package [com.unity.shadergraph@12.1.0] cannot be found

ヘルプメニューから、パッケージをリセットして再起動すれば
だいたいは直る。

Canvasサイズについて 

デフォルトのままだと、Canvasのサイズは大きいままなのですが 

レンダーモードをスクリーンスペースカメラに変更すると 

ちょうどいい大きさにできます。 

スクリーンスペースにすると 

Canvasは指定したカメラによって描画される。

UIのサイズは画面内に収まるように自動で調整され、

カメラからの距離では前後関係のみが考慮される。

ただし UIは常にカメラの正面になるので注意。

TextMeshProを日本語化しよう

Textmeshproはデフォルトだとアルファベットしか使えないので 

それを日本語化しましょう。 

まずは、日本語のフリーフォントをダウンロードしておきます。

ダウンロードしたフォントは、Unityにインポートします。

そしたら次にメニューから 

Window > TextMeshPro > Font Asset Creatorを選択します。 

そして以下の設定をします。

Source Font File:Unity に入れた日本語フォントを選択

Atlas Resolution:両方とも「8192」に変更

Character Set:「Custom Characters」を選択

次に日本語の文字Textを入れます。  

日本語文字コードはこちらです。 

これを全部コピーして、Custom Character Listに入れます

コピーをしたら、下の方にある 

Generate Font Atlas」を押します。

で、最後に下の方にあるSaveを押すと 

フォントファイルが作られています。 

あとはTextmeshproのインスペクターで 

Font assetの部分を先程作ったフォントに変更をすれば 

日本語が使えるようになります。 

シーンビューでの簡単操作 

シーンビューでは右クリックを押しながら 

WASDキーを押すと一人称視点で移動ができます。 

また、 QとEキーを押すと上下の調整ができます。 

そしてオブジェクトの選択をして 

ALTキーを押しながら、マウス操作で 

オブジェクトを中心に視点の回転もできます。 

LとRポジションについて 

オブジェクトをShiftキーで複数選択した状態で 

ポジションの所に L(-5,5)と入力すると

このように、その間で均等に配置をしてくれます。  

逆にR(-5,5)と入力すると  

その間でランダムな配置にしてくれます。 

イベント関数の優先順位について

イベント関数には優先順位がありまして 

以下の順番で働きます。 

  • Awake()
  • OnEnable()
  • Start()
  • OnDisable()
  • FixedUpdate()
  • OnTrigger()
  • OnCollision()
  • Onmouse()
  • update()
  • Lateupdate()
  • OnDestroy()

の順番で働くので覚えておきましょう。 

コメント

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