ゴマちゃんフロンティア

気まぐれと勢いで作るUnityゲーム開発日記です。

【再編集】Unity開発メモまとめ (その他)

time 2015/09/28

※本記事は旧ブログの記事を再編集し、再度投稿したものです。
 一部内容に差異がある可能性がありますので、予めご了承ください。

AddForceのForceMode

RigidBody.AddForce()の第2引数として、力の加え方を指定することができます。
今のところ4種類あるようです。

・Force
対象のRigidbodyに継続的な力を加えます。
ForceModeを指定しない場合はこれになります。

・Impulse
対象のRigidbodyに瞬間的な力を加えます。
「オブジェクトに判定が当たったら~」などの場合に力を加える場合はこちらを指定します。
1回の呼び出しで吹き飛ばす際、Forceの場合はかなりの力を加えないと満足に吹き飛びませんが、こちらを指定すればそこそこ飛ぶようになります。

・Acceleration
対象のRigidbodyのMass(質量)を無視して、継続的な力を加えます。
オブジェクトの質量によらず一定量飛ばす場合などに使える・・・かも。

・VelocityChange
対象のRigidbodyのMassを無視して、瞬間的な力を加えます。
AccelerationやForceよりは使う機会がありそうです。

テクスチャの存在するマテリアルの取得

オブジェクトに複数設定されているマテリアルから、テクスチャが貼られているマテリアルのみ取得したいことがあります。
テクスチャを動的に切り替えたりする際は特にですね。
自分はキャラクターの顔オブジェクトをheadObjectに設定し、Start内に以下のスクリプトを書いて取得しています。

 
Renderer faceRenderer = headObject.GetComponent<Renderer>();

for (int i = 0; i > faceRenderer.materials.Length; i++ ) {
    if (faceRenderer.materials[i].GetTexture("_MainTex") != null) {
        faceMaterial = faceRenderer.materials[i];
        break;
    }
}

テクスチャが1つだけの場合は_MainTexに貼られることが多いので、GetTextureの返り値で判定しています。
breakを外せば複数のテクスチャ付きマテリアルが取得できます。
その場合はfaceMaterialに代入するのではなく、配列に足していく感じにするのがいいと思われます。

定数

定数だけをまとめた静的なクラスを作成します。
usingも関数も必要なく、GameObjectに付ける必要もありません。
定数が多くなってきた場合、内部クラスか別ファイルとしてクラスを分けて整理します。

 
public static class GameConstants {
    public const float DEFAULT_HP = 100;
    public const float DEFAULT_SP = 100;
}

参照する場合は「クラス名.定数名」でアクセスできます。
例の「DEFAULT_HP」にアクセスしたい場合、「GameConstants.DEFAULT_HP」といった形になります。
プロジェクト内のスクリプトであればどこからでも参照できます。

ログファイルの出力

適当に空のGameObjectを作り、以下のスクリプトを付けます。

 
using UnityEngine;
using System;
using System.IO;

public class LogManager : MonoBehaviour {

     private string output;
     private string stack;
     private string basePath;

     private FileStream fs;
     private StreamWriter sw;

     void Start() {
          // プロジェクトパスの取得
          basePath = System.IO.Directory.GetCurrentDirectory();

          // ログフォルダ生成
          System.IO.Directory.CreateDirectory(basePath + "/Logs");
     }

     void OnEnable() {
          Application.logMessageReceived += HandleLog;
     }

     void OnDisable() {
          Application.logMessageReceived -= HandleLog;
     }

     void HandleLog(string output, string stack, LogType type) {
          try {
               DateTime date = System.DateTime.Today;

               // ログファイル生成
               FileStream fs = new FileStream(basePath + "/Logs/" + date.ToString("yyyyMMdd") + ".log", FileMode.Append);
              
               // ログファイルへ出力
               sw = new StreamWriter(fs);
               sw.WriteLine(output);
               sw.WriteLine(stack);

          } catch (FileNotFoundException e) {
               Debug.Log("File Not Found: " + e.ToString());
          } catch (UnityException e) {
               Debug.Log(e.ToString());
          } finally {
               sw.Close();
               fs.Close();
          }
     }
} 

「Application.logMessageReceived」はログメッセージが出力された際に呼び出されるイベントです。
「Application.RegisterLogCallback」は古い形式のようです。
Unity5から変わっているようなので注意します。

Start内でログファイルを格納するフォルダを生成します。
System.IO.Directory.GetCurrentDirectory()でProjectのフォルダまでのパスが取得できます。
その直下にCreateDirectory()でフォルダを生成します。

ログ出力時にHandleLog()が呼ばれるので、この中でファイルを生成します。
System.DateTime.TodayのToString()でフォーマットを指定します。

FileStreamインスタンス生成時にファイルがない場合、自動的にファイルが生成されます。
デフォルトでは上書きされてしまうので、FileModeをAppendにしておきます。
あとはFileStreamを使ってStreamWriterを作り、WriteLine()でログファイルに出力します。
finally句でCloseするのも忘れないようにしましょう。

スポンサーリンク

down

コメントする



ツイッター