読者です 読者をやめる 読者になる 読者になる

戸森ブログ

主にUnityやC#のTipsを書いていきます

【Unity】 任意のポリゴン数のPlaneを生成するエディタ拡張

Unity C# エディタ拡張

Planeの三角ポリゴン数を確認する

ポリゴン数を表示するエディタ拡張は藍と淡々様の記事が参考になります。

megumisoft.hatenablog.com

Unityのデフォルトで作成出来るPlaneの三角ポリゴン数を見ると、200ポリゴンあります。

f:id:tomori-aki2961:20160806203231p:plain

Planeのメッシュにテクスチャをアタッチするだけでしたら2ポリゴンあれば充分です。
次項に掲載するソースコードはUnify Community WikiのCreatePlaneに手を加えたものです。

CreatePlane - Unify Community Wiki

使用方法

Editorフォルダがない場合はEditorフォルダを作成します。

f:id:tomori-aki2961:20160806212643p:plain

EditorフォルダにCreatePlane.csを追加します。

f:id:tomori-aki2961:20160806213125p:plain

Hierarchy > Create Other > Custom Planeを選択します。

f:id:tomori-aki2961:20160806213322p:plain

各種項目を設定してCreateをクリックします。

f:id:tomori-aki2961:20160806214426p:plain

Planeが生成されました。
Unityのデフォルトで作成出来るPlaneと同じサイズにしたい場合はWidthとLengthを10にします。

f:id:tomori-aki2961:20160806215444p:plain

参考にさせていただいたサイト

baba-s.hatenablog.com

【Unity】 メッシュが暗いときに見るべきところ

Unity Tips

メッシュが暗い

Unity5ではSkyboxがデフォルトで適用されており、Ambient LightがSkyboxの色で設定されているので
メッシュが真っ黒になっているという質問を受けることが減りました。
ですが、稀にメッシュが暗いという質問を受けるので原因であることが多かった順番でまとめてみました。
f:id:tomori-aki2961:20160805201256p:plain

TransformコンポーネントのScaleが0になっていた

f:id:tomori-aki2961:20160805203536p:plain

Lightコンポーネントが機能していなかった

f:id:tomori-aki2961:20160805231207p:plain

ライトが配置されていなかった

f:id:tomori-aki2961:20160805231654p:plain

Ambient Intensityが0になっていた

f:id:tomori-aki2961:20160805232450p:plain

Ambient SourceがColorで暗色が設定されていた

f:id:tomori-aki2961:20160805232856p:plain

逆に真っ暗にしたい

tsubakit1.hateblo.jp

【Unity】 if文とnull合体演算子でnullチェックをするプロパティの処理時間の比較

Unity C# 最適化

はじめに

nobollel-tech.hatenablog.com
baba-s.hatenablog.com
tsubakit1.hateblo.jp
qiita.com
qiita.com

上記のように多くの方々がUnityにおけるnull合体演算子の注意点について言及されております。
最初から利用しない、又は注意点を理解した上でご利用ください。

結果

nullチェック ループ回数 試行回数 平均処理時間 最長処理時間 最短処理時間
if文 100000回 100回 8.205014ms 11.42895ms 7.659793ms
null合体演算子 100000回 100回 2.485219ms 4.086733ms 2.307057ms

if文でnullチェックをするプロパティの処理時間の計測


null合体演算子でnullチェックをするプロパティの処理時間の計測

【Unity】 処理時間を計測する 【更新版】

Unity C#

変更点

・ループ回数を指定出来るようにしました。
・試行回数がrepeatだとループ回数とややこしいのでattemptに変更しました。

【Unity】 There are inconsistent line endings in the 'Assets/Scripts/Hoge.cs' script. の対処法

Unity C# 警告の対処法

見慣れない警告

f:id:tomori-aki2961:20160803001715p:plain

There are inconsistent line endings in the 'Assets/Scripts/Hoge.cs' script. Some are Mac OS X (UNIX) and some are Windows.
This might lead to incorrect line numbers in stacktraces and compiler errors. Many text editors can fix this using Convert Line Endings menu commands.

エディタ拡張でクラス生成を行っていたときに上記の警告に遭遇しました。

改行コードの一貫性がないことが原因

OS 改行コード
Windows \r\n
UNIX \n
Mac \r

Windows上では" \n "と" \r\n "が内部的に適当に変換されるらしく
厳密にはWindowsの改行コードは" \r\n "だそうです。

private void Hoge(string className)
{
    StringBuilder builder = new StringBuilder();

    builder.Append(String.Concat("public class ", className, "\n"));
    builder.Append(String.Concat("{", "\n"));
    builder.Append("}");
}

私はWindowsユーザーなのですが改行コードを\nだと勘違いしており、上記のようなコードを書きました。
次項では2つの解決方法を紹介いたします。

解決方法1

private void Hoge(string className)
{
    StringBuilder builder = new StringBuilder();

    builder.AppendLine(String.Concat("public class ", className));
    builder.AppendLine("{");
    builder.Append("}");
}

AppendLineメソッドを呼び出すことでメソッドが行末に使用している環境で定義されている改行コードを追加してくれます。
改行コードだけを追加したい場合も下記のようにオーバーロードされているAppendLineメソッドを呼び出すことで追加出来ます。

private void Hoge(string className)
{
    StringBuilder builder = new StringBuilder();

    builder.Append(String.Concat("public class ", className)).AppendLine();
    builder.Append("{").AppendLine();
    builder.Append("}");
}

解決方法2

private void Hoge(string className)
{
    StringBuilder builder = new StringBuilder();

    builder.Append(String.Concat("public class ", className, Environment.NewLine));
    builder.Append(String.Concat("{", Environment.NewLine));
    builder.Append("}");
}

Environment.NewLineプロパティを呼び出すことで
使用している環境で定義されている改行コードを取得することが出来ます。
なお、AppendLineメソッドでは自動的にEnvironment.NewLineが追加されます。

【Unity】 モデルビューアを実装する

Unity C#

ある日の出来事

アーティストさんとUnity上で3Dモデルを確認していると
「このモデルの側面見せてください、次は裏側に移動してズームしてみてください」
要望に応じてシーンビューでマウスをせっせと操作するのですが案の定指が疲れたので作成しました。
ゲームパッドに対応させておくと楽々操作出来るのでお好みでInput周りを改良してください。

使用方法

カメラにModelViewerコンポーネントをアタッチします。
f:id:tomori-aki2961:20160731221341p:plain

既にシーン上にモデルが配置されていた場合はResetイベントが呼び出されて自動でコンポーネントが取得されます。
f:id:tomori-aki2961:20160731224339p:plain

もし、後からモデルを配置した場合はModelViewerコンポーネントの右上の歯車アイコンをクリックして
f:id:tomori-aki2961:20160731224530p:plain

Resetを選択すると
f:id:tomori-aki2961:20160731224706p:plain

コンポーネントを取得することが出来ます。
f:id:tomori-aki2961:20160731224339p:plain

実行結果

操作 処理
マウスホイール ズーム
左ドラッグ カメラ回転
右ドラッグ y座標のオフセット移動
Rキー カメラをリセット

f:id:tomori-aki2961:20160731225955g:plain

【Unity】 オブジェクトにランダムな力を与えて弾けさせる

Unity C# 汎用メソッド

ランダムなベクトルを作る

Vector3 force = new Vector3(Random.Range(-4.0f, 4.0f), Random.Range(-4.0f, 4.0f), Random.Range(-4.0f, 4.0f));

ランダムなベクトルを作るために上記のような書き方をすると稀に全てが0.0fのベクトルが出来てしまうことがある。
オブジェクトを弾けさせる際に与える力が0では困るので-4.0f ~ -1.0f及び1.0f ~ 4.0fの範囲でランダムなベクトルを作るため
及び上記のような長いコードにならないように次項の汎用クラスを作成する。

汎用クラスのソースコード


実行結果

f:id:tomori-aki2961:20160731235324g:plain