【プログラムメモ】ソースコードのリファクタリングについて

というわけで、寒さが厳しい日が続く山梨です。
会社の開発室はマシン温度からか暖かくなることが多いのですが、ちょっと外に出ると肌寒い感じです。
家の灯油も補充しておいた方がよさそうです。

今回はタイトル通り、ソースコードの扱いについてのお話です。
というのも、新しい機能を実装しようにもクラス関係はソースが煩雑すぎて、思うように進めないことが多くなっているためです。
なので、各クラスの役割を明確化し、それに沿ってリファクタリングを行おうと思います。

ここで記載するものは自己流なので、当然ですが正しい扱い方とは限りません。
あくまでも参考程度ということで・・・。

コントロール系

最もシンプルで、オブジェクトのコントロールを担うクラスです。
キャラクターや物などのオブジェクトは勿論、各種判定や音などもこれになります。

当初はパラメータ(フィールド)を別クラスに持たせようかと考えたのですが、
・クラス内で扱うパラメータを外部に出すのはよろしくない
 →データベースや外部システムと連携しているわけではない
・カプセル化すると呼び出す度にゲッタやセッタを使うことになる
 →Update()などの処理で大量に呼び出すことになってしまう
・そもそもパラメータが外部に分ける必要があるほど多くない

などの理由により、普通にコントロール系クラスに持たせることにしました。
見直すと関数内で一度しか使っていないような変数もフィールドに書いていたりするので、整理すればスッキリするかもしれません。

どうしても長くなってしまうので、コメントやXMLドキュメントはしっかり書いていきます。
VisualStudioなら日本語も扱えるのでやりやすいです。

マネージャ系

複数のオブジェクトを管理したり、ステージ・シーン全体の管理を行うクラスです。

例えばゲーム全体を管理する「GlobalManager」というクラスでは、スクリーンショット機能やログ出力機能を実装しています。
ステージの進行状況を管理したり、敵やオブジェクトの出現を管理するものが多くなりそうです。

サービス系

定義が曖昧ですが、「複数のオブジェクトから参照される処理」を実装するクラスです。

例えば攻撃判定の生成はプレイヤーも敵も行うので、サービスクラスに書いています。
役割的にインターフェースを被っていそうですが、こちらはサービスを通して実装しているので中身も共通です。

パラメータの初期化などもこちらでいいかなーと思いますが、プレイヤーと敵で持ち方が異なるので不適切かと思われます。
「プレイヤーだけ」「敵だけ」ならスーパークラスのStart内で十分なので、線引きをしっかりしていきたいです。

ユーティリティ系

サービスクラスの静的な機能をまとめたもの・・・でしょうか。
「オブジェクトを取得」「一定の処理を行う」等の汎用性の高いものはこちらにまとめようと思います。

定数系

その名の通り、定数を定義しておくクラスです。
定数の種類によって「System」「Game」などと分けて管理しています。
性質上、全て静的で実装のないクラスになります。

定数の使い方はブログ移行時に再度まとめてあります。

インターフェース系

あまり使うことはないと思われますが、インターフェース用のフォルダを作っておきます。
C#のインターフェース名は先頭に I を入れるのが普通らしいので、その命名規則に従います。

Animator系

AnimatorControllerのステート用のスクリプトで、「StateMachineBehaviour」を継承しているクラスです。
これだけは扱いが大きく異なるので、専用の名前空間で分けておきます。

まとめ

そんなわけで、クラス毎の役割を明確化し、簡単なリファクタリングを行ってみました!
漠然とスクリプトを追加していくよりは、一定のルールに沿って作っていく方が統一性があり、分かりやすくなります。
今後新しくスクリプトを作る時は気を付けていきたいですね。

河口湖紅葉祭り(2015年)に行ってきました!

というわけで、新ブログでの「行ってきました」シリーズ第2弾です。

CIMG1296_R

今回は河口湖の紅葉まつりに行ってきました!
夜にライトアップされるのが特徴とのことなので、20時頃に現地に着くよう出発しました。
駐車場は有料(500円)でしたが、スペースはそこそこ広かったです。

初めて夜にデジカメで撮影を行うのですが、「夜景モード」なるものがあることを今日になって知りました。
ということなので、本記事の写真は全て夜景モードで撮ったものです。
夜でも暗くならずに撮れますが、光が強すぎて夜景っぽくなくなってしまう場合もあります。

CIMG1306_R

駐車場から紅葉回廊まで歩いて向かいます。
街路の紅葉がいい感じに赤くなっており綺麗でした。

CIMG1300_R

紅葉回廊入口です。
「行ってきました」という証明には看板を撮ることが重要です。
夜景モードであれば暗くてもくっきり撮れますね。

以下、紅葉回廊内で撮った写真です!

CIMG1256_R

CIMG1268_R

CIMG1281_R

CIMG1267_R

CIMG1265_R

CIMG1260_R

CIMG1292_R

ついでに夜の河口湖を撮ってみました。

CIMG1294_R

明かりがほとんどなく、昼間の綺麗な水面とは対照的です。
なんだかちょっと怖い感じです。

まとめ

そんなわけで、河口湖の紅葉祭りに行ってきました!
観光地としての山梨の良さは何と言っても人の少なさで、見たり歩いたりゆっくり楽しめます。
まだ見頃はこれからだと思うので、足を運んで見るのも良いと思います!

今日のイラスト

ペンタブを買ったのでいろいろ描いていきたいところです。
シルリスを元に輪郭と色を適当に付けてみました!
GIMPで加工を入れたものより大雑把で整っていませんが、これはこれで趣があっていいかもです。
とりあえずペンタブに慣れたいので、なるべくペンタブだけで描くようにします。

shilriss4

【キャラクターメモ】ちょっとしたモーションの作成

というわけで、早くも11月、今年もあと2ヶ月になりました。
未だに「ちょっと前は夏だったのに」と思うこともしばしば・・・。
時間の流れって早いものですね。

今回はタイトル通り、「ちょっとした」モーションの実装になります!
「ゲーム的になくてもいいけど、あると雰囲気いい」といったものですね。

shot2ss20151105230008984

いつもマリンパで作ってばかりなので、今回はシルリスで作ってみました!
小さなリスの体格なので、可愛らしいモーションを付けていきたいところです。
といっても移動やジャンプなどは3匹ほぼ共通だったりしますが・・・。

ストール部分にClothを入れたので、そのテストも兼ねています。
首元なのでマントのように激しくは動かさず、アニメーションから受ける影響も少なめに設定しています。

待機モーション

一定時間操作しないで放置した際のアレです。
最早ほとんどのゲームに搭載されており、ない方が珍しいというレベルかもしれません。

shot2ss20151105225310728

シルリスの場合、杖を後ろ手に持ってキョロキョロします。
FEZの某クラスの待機モーションとすごく似ています。

だいたい5秒無操作で待機モーションを再生し、終了後また5秒無操作で~くらいがちょうど良いでしょうか。
フレーム数で測るのも面倒なので、Time.deltaTimeで何とかします。

体力減少時のモーション

いわゆる「疲れている状態」です。
体力ゲージが減ってきたら通常の待機モーションからこちらのモーションに切り替えます。

shot2ss20151105225632056

通常の待機モーションと同じく、ImportSettingsでLoopを有効にしておきます。
作ってみるとなかなか辛そうなモーションになったので、体力ゲージ1/4以下くらいから切り替えるのが良い感じでしょうか。
AnimatorのParameterに体力値を設定し、それで判定する予定です。

倒された際のモーション

体力ゲージがなくなり、「ミス」した際のモーションです。
別モーションで既に「吹き飛ばされた際のダウン状態」というものがありますが、それとは別で考えてみます。

shot2ss20151105225451864

シンプルにうつ伏せに倒れてもらいます。
体力ゲージがなくなった瞬間、あらゆるモーションから割り込んで再生する予定です。
挙動的にはモンハンの力尽きた際のものに似ています。

決めポーズ

キャラクターに1つは決めポーズが欲しいところです。
長いモーションを作ってもくどいだけなので、サクっとできるレベルのものを作ります。
シルリスの場合は杖を持っているので、くるくる回した後に両手持ちさせてみます。

shot2ss20151105225834184

「これどこで使うのよ」と言われれば・・・ステージクリア時とか、キャラクター選択時とか・・・くらいしかなさそうです。
恐らくプレイヤー操作で起こすモーションではないと思うので、スクリプトも作っていません。
必要なときにAnimator.Play()でいいんじゃないでしょうか (適当)

まとめ

そんなわけで、本当にちょっとしたモーションの実装を行いました!
ステージもできていない今、こんなモーション後回しでいいのは確かですが、自作キャラをカスタマイズするとモチベが上がります。
本作業が止まらない程度に、こういった他の部分も作っていきたいところです。

「X-WeaponTrail」を使った武器の軌跡について

[2016/04/30]
記事を一部追記しました。

というわけで、文化の日なのでごろごろしているりべるんです。
文化的なことは全くしてないです!
一応、本屋にいって参考書等を読んできたので、それを文化的と捉えるならば・・・といったところです。

20150605_1

今回はAssetStoreにある「X-WeaponTrail」というアセットを使ってみました!
剣などの武器の軌跡をレンダリングしてくれるもので、すごく綺麗な軌跡ができます。

今まではUnity標準であるTrailRendererを使っていましたが、イマイチ使いにくかったり、レンダリングに不満があったりしました。
TrailRendererで軌跡を作るよりは、X-WeaponTrailを使った方がよさそうです。

導入と使い方

AssetStoreから無料でダウンロードできます。
https://www.assetstore.unity3d.com/jp/#!/content/20972

インポートすればプレハブがある上、デモシーンも付いてくるのでとっつきやすいです。
基本的に「X-WeaponTrail」というプレハブを付与するだけでOKです。

shot2ss20151103161523185

キャラクターのアニメーションに合わせる場合、Armatureの剣の動きに対応するBoneの子オブジェクトとして設定します。
メッシュにそのままくっ付けても追従しないので注意が必要です。
マリンパのモデルの場合、上のように「Bone_L_009」の子オブジェクトに設定しました。

プレハブの子オブジェクトに「StartPoint」と「EndPoint」があるので、これで軌跡の幅を調節します。
それぞれ赤と青の点が表示されるため分かりやすいです。

shot2ss20151103160637282

あとは再生して剣を動かすだけ!
設定で変える必要があるのは色くらいで、他は初期状態でも大丈夫な感じです。

shot2ss20151103161243006

通常のマテリアル以外に、歪みが出るマテリアルも提供されています。
重みのある武器でズドンとやる時に使うと味が出るかも。
単に「歪みが出せる」というだけでも貴重ですね。

攻撃時のみ軌跡を表示する方法

簡単な設定で奇跡の表示は出来ますが、現状ではレンダリングを止めることができません。
実際に使う場合は攻撃時のみ表示させることがほとんどです。
ということでちょっと考えてみました!

shot2ss20160430221425374

単純に X-WeaponTrail のプレハブを非アクティブにするだけではダメで、上のように残像が残ってしまいます。
スクリプトのパラメータを弄っても同じでした。

X-WeaponTrail のスクリプトを見ると、初期化時に専用のオブジェクトを生成し、そこで軌跡をレンダリングしているようです。
こいつの有効/無効を切り替えればいけそうです。
Player クラスから Find() するわけですが、オブジェクト名でFindするのは少々厳しそうです。
XWeaponTrail.cs の413行目付近でオブジェクトを生成しているので、そのオブジェクトにタグを設定します。

shot2ss20160430221441984

GameObject.tagに代入すれば動的にタグを設定できることはこれで初めて知ったりします。
タグマネージャに存在しないタグは弾かれてしまうので、予め登録しておきましょう。

あとはPlayerクラスで攻撃中のみアクティブにすればOKです。
単純に setActive() を使います。
AnimatorController を使っているのであればステートのタグで判定すれば良いだけなので、実装部分は割愛します。
以下の記事が参考になると思われます。

【再編集】Unity開発メモまとめ「Animator」

まとめ

短めですが、X-WeaponTrailを使って剣の軌跡を新しくしてみました!
有用なアセットを作成、配布して下さる方には感謝するばかりです。
自分も何か作れるようになってみたいところです。

富士見高原 八峯園鹿の湯へ行ってきました!

というわけで、新ブログ初めての「行ってきました」シリーズです。
自分の行った地域や観光地を写真を交えて載せるもので、ゲーム開発とは完全に無関係です!
紅葉が綺麗な今日この頃、どこか家族で遠出しようということで・・・

今回は富士見高原にある「ホテル八峯苑 鹿の湯」へ行ってきました!
南アルプスICから中部横断道に乗り、双葉JCTで中央自動車道に乗り換えて小淵沢ICまで行きます。

CIMG1130_R

途中で八ヶ岳PAに寄りました!
八ヶ岳が綺麗に見えますが、まだ雪は被っていないようです。
ちなみに南アルプスIC~小淵沢ICまでの間には、八ヶ岳PAしか休めるところがなかったりします。

CIMG1136_R

CIMG1150_R

CIMG1146_R

「八峰苑 鹿の湯」は小淵沢ICから10分ほど走ったところにあります。
場所さえ分かっていればそれほど迷わないと思われます。
所々木々が赤く染まっていていい具合です。

到着早々、さっそく温泉に入りました!
自分自身温泉に入ったのは久しぶりなので、レポできるほどの知識はありませんが、なかなかよかったです。

CIMG1140_R

温泉上がりと言えばやっぱりこれでしょうか!
コーヒー牛乳版も勿論あります。

CIMG1155_R

温泉の後、「天空の遊覧カート」に乗りました!
前に団体の客が大量にいましたが、割とすぐに順番が回ってきました。
カートは4人乗りで、全自動で展望台まで登っていきます。
所要時間は登りで25分、下りで20分程だそうです。

CIMG1167_R

白樺がたくさんありました。
ここまで多くあるのは割と珍しいのではないでしょうか。

CIMG1198_R

結構急な坂道を登っていきます。
少しすると鹿の宿を見下せる程高いところまで行きます。

CIMG1200_R

一番上の展望台から見た景色です!
諏訪湖と北アルプスが見えます。

CIMG1201_R

CIMG1202_R

南側には富士山が見えました!
雲がかかっていましたが、逆にそれが頭を出しているようでいい感じです。

CIMG1223_R

展望台は何か所かあり、ぐるっと1周できるようになっています。
上の写真はより富士山よりの展望台で撮ったものです。

まとめ

そんなわけで、富士見高原の鹿の湯へ行ってきました!
秋の紅葉シーズン、山の方に出かけるのも良いのではないでしょうか。
山の方は相応に寒いのですが、温泉に入ればホッカホカで気持ちいいです。