ロボット改修モデリング
コミケも近づいてきたのでマジメにゲームを作るためにロボモデルを改修したのでその過程をまとめ。
ディテールアップ
左が以前作ったモデル。そのモデルにディテールアップとなるポリゴンをざくっと追加。
追加したポリゴンはホントに適当。ここでは作りこまない。
あくまでもディテールの密度などバランスを見ながら足したり引いたり。
さらに諸々追加。
TPSのアクションシューティングなので後ろからの視点となるため、ロボの背面をかっこよくするためにスラスターなどを追加。
バランス調整。ポーズを取らせた状態でかっこよく見えるように各パーツを拡縮したり。結構雑だけどどうせ作り直す予定なので速度重視で。
ゲーム中でスピード感のある動きをさせたいので、速そうなタイプに。
配色
ディテールアップのラフが出来たので配色してバランスを見る。
配色のバランスによってパーツの追加も必要になるため、ある程度できた段階で色を置いてみる。
下図は決定稿。
赤や青などアニメ系ロボのカラーパターンも用意してみたけど、どうしてもオモチャっぽく感じてしまう。兵器に派手な色は必要ない、という考えが払拭できないのもあった。
そもそも塗装はサビ防止や耐熱だったり兵器の場合は迷彩用途だったり。車などは購買意欲を湧かせるためだけど、兵器は一般消費者が買うモンでもないし。
ということでシンプルなモノクロ系にして兵器っぽく。量産機っぽいけど、主人公が最初に乗る機体がいきなりヒーロー機っぽいのもね。設定次第だけど。
以下はカラーパターンの没案。この辺は好みの問題でしか無いと思うけど。
この後は作りこんで行く前に一度Unity側に持って行き、構造に問題ないかやポリゴン数が多すぎないかチェックしてから進める予定。
VRCアワード 一次審査通過の手ごたえ
昨日VRCアワードの一次、二次審査の結果が発表され、「VRサイクリング」が一次審査を通過したということで掲載されました。
VRサイクリングは割りと自身があっただけに、ファイナリストになれなかったのは残念。だけど手ごたえは十分に感じられたので、最初っから狙いに行けばたぶん取れるかなー、とも。
もうちょい賞金とか上がってくれればやる気も出るけど・・・。今の賞金だとファイナリストとしてアワードに行く費用で赤字に。
来年はちょっと狙いにいってみようかな、と。ちょっと周りの手も借りてしまえば可能性はかなり高い。
今回は「VRサイクリング」のほか「ふぉとゆに」も応募してみたけど、こちらは残念ながら1次審査にて落選。
ふぉとゆに自体もViveの持ち味を活かしたコンテンツということでそこそこ自信はあったけど、やっぱりインパクトが少し弱かったかなあ。
これまではキャラクターを表示するだけでも新鮮さによって「スゴイ」ってなってたけど、ただVRにしただけという新鮮さは薄れていくのでコンテンツとしての面白さやVRならではの何かがないとこの先生き残れないと思う。
VRの開発環境はかなり整ってきたので、今後は企画面の方が重要になっていくと思うのでプランナーやデザイナーはUnityなり覚えてVRに挑戦して企画力で勝負してほしいとこ。
【Unity】ユニティちゃん3モデルのインポート
現在配信中のユニティちゃんの3モデルのインポートについて。
・ユニティちゃん(ノーマル)
・ハロウィンバージョン
・キャンディロックスターバージョン
インポートの順番
1.UnityChan_1_2.unitypackage
2.UnityChanHalloween.unitypackage
3.UnityChanScript_ver1.2.1_Unity5only.unitypackage
4.UnityChanShaderVer123_forUnity5.4.unitypackage
とりあえずこの順序に突っ込んでノーマルバージョンとハロウィンバージョンが共存すればOK。
キャンディロックスターバージョンについて
CRSバージョンはモデル単体が無いのでプロジェクトファイルから引っこ抜く。
プロジェクトを開いてUnityChanフォルダ以外をすべて消してからエクスポート。
その後ノーマルとハロウィンを入れたプロジェクトにインポート。
たぶんシェーダーがおかしくなるので、もう一度UnityChanShaderVer123_forUnity5.4.unitypackageをインポートする。
たぶんこの手順でOKのはず。
【Vive】コントローラのボタン入力の取得【Unity】
HTC Vive Preのコントローラのボタン入力について
コントローラのプレハブがシーンに追加した後の設定となります。
その辺りはやのせんさんが作られた以下資料を参照。
http://www.slideshare.net/KojiroYano/vive-59807782
トリガー入力のサンプル
下記サンプルをコントローラのプレハブにアタッチします。
SteamVR_TrackedObject trackedObj; void Awake() { trackedObj = GetComponent<SteamVR_TrackedObject>(); } void Update () { var device = SteamVR_Controller.Input((int)trackedObj.index); if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger)) { Debug.Log("GetPressDown Trigger"); } }
たったこれだけです。
SteamVR-Extras フォルダ内の SteamVR_TestThrow のスクリプトを参考にしています。
また、コントローラ周りは SteamVR_Controller スクリプトを見れば大体記載してあります。
上記スクリプトではトリガーを押した瞬間のみ反応します。
「GetPressDown」を書き換えればトリガーのタイミングを変更できます。
GetPress | ボタンを押してる間 |
GetPressDown | ボタンを押したとき |
GetPressUp | ボタンを離したとき |
また、ButtonMask.Triggerの「Trigger」部分を書き換えると別のボタン状態を取得できます。
Touchpad | 中央の大きな円形ボタン。タッチパッドとして座標も取得可能 |
ApplicationMenu | タッチパッドの上のボタン |
Grip | グリップボタン |
Trigger | トリガーボタン |
※System、Axisは現時点ではまだよくわかっていないので割愛
タッチパッドについては、「GetTouch」「GetTouchDown」「GetTouchUp」を使うようです。
ただしタッチパッドに触れただけで反応してしまうので、用途によって使い分けます。
タッチパッドの座標の取得
上記スクリプトに書きコードを追加します。
if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad))
{
Debug.Log( device.GetAxis() );
}
タッチパッドに触れている間、座標をデバッグログに表示します。
タッチパッドの中央が (0.0) となり、左と下がマイナス、右と上がプラスになります。
Vector2型なので、X座標だけ取得したい場合は「device.GetAxis().x」のように記述します。
バイブレーション
Viveのコントローラは振動させることができます。
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger)) { device.TriggerHapticPulse(2000); }
「TriggerHapticPulse」で振動させます。
振動の強さは渡す値が大きいほど強くなります。
ただし100~2000内の数値となります。
ひとまずコントローラに関してはここまで。
【サイクリング】大阪~日本海(舞鶴)の旅
三連休ということで少し遠出をしよう、と思い日本海へ。
舞鶴へは既に3回ほど行っているのでコースもほぼ完全に把握済み。
何回も道を変えながら発見した、なるべく車が少なく坂も抑えたルート。
距離も集合場所から120km弱とそこそこ。
今回は新たな装備としてApiduraのサドルバッグを投入。
最近流行りつつあるバイクパッキングのサドルバッグ。
既に一つ所持していたが、そちらはかなり容量が入るタイプで今回の日帰り輪行では空きが出来てしまうため、こちらのコンパクトモデルを購入。
コンパクトながら輪行バッグと着替え+αが余裕で入り、日帰り~1泊程度であればこれで十分。
さらにコンパクトサイズのためあまり出っ張らず、バランスも崩しにくく走る邪魔にならなかった。
●今回の休憩ポイント
・ファミリーマート 上津島店 集合場所
・ローソン 川西山下町 19km地点
・ファミリーマート 亀岡宮前町店 40.5地点
・胡麻駅 67km地点
・ファミリーマート 綾部下八田店 99.5km地点
後半はペースを落としつつ長く走る方へ切り替えたため休憩が少なめ。
終始向かい風が吹き続けていたので連れのペースが上がらずノンビリの旅に。
なにせ胡麻駅で昼食後は1回の休憩だけで舞鶴に行ったわけだし。
だいたい20km/h 前後で走り、約8時間でとれとれセンターに到着。
・綾部近郊の橋
結構頑丈なコンクリづくりだけど手すりが低くスカスカのため、いろいろ落としそうだし落ちそうだしで怖い。
・舞鶴とれとれセンター
ここに来なきゃ舞鶴に来た感じがしない。
売っている魚介類はそのまま生で食べれたり、店で焼いてもらって食べることが出来る。ただし17時くらいで焼くのが終わるのでお早めに。
イカの足とエビを焼いて食べた。それぞれ250円くらいで観光地としては安めかな。
・舞鶴港
残念ながら湾のため大海原は見えず。五老岳まで登れば一望できるが、今回は見送り。
前回は護衛艦みたいなのが停泊していた。
以上、舞鶴の旅。
日本海までの道は覚えてしまえば結構楽しい。
もう30kmほど走ると天橋立まで行けるので、次回日本海の旅は天橋立を目指す予定。
【Unity】ユニティちゃんをロードバイクで走らせる【Final IK】
ユニティちゃんをロードバイクで走らせる。
VRサイクリングのライバルカーというかナビカーとして出すため。
↓のような動きになるまでの顛末
とりあえず耐えうるものになったと思う。
— おばた (@obaatsu) 2016年3月12日
使用したのはFinal IKでした。ロードバイクは自作でLightwave作。 pic.twitter.com/0iJ3udF01q
・モデル
使用したモデルはユニティちゃんと自作ロードバイクモデル。
ユニティちゃんのモデルデータは公式ページから。
特にどちらもコレといって特別なものは無し。
ロードバイクモデルもクランクが動かせるモデルデータであればなんでもOK。
ユニティちゃんモデルは、髪を動かすためにプレハブ内の「unitychan_dynamic」を使用。
こんな感じで配置。
・Referencesの設定
アタッチした時点で自動で設定してくれるので、この辺は特にいじらない。
Rootだけ『Character1_Reference』にしといたほうがいいかな。
・Bodyの設定
座る位置を設定する。
空のオブジェクトをサドルに配置し、Targetに設定する。
でも結局Position Weightは「0」のままだからいらないかも。お好みで。
ChainのPull Body Vertical を「0.5」に、MappingのMaintain Head Rotを「0」に設定。
上体を上げたり頭を上げる設定。好みに調整して問題ない。
設定しないとこんなことになる。
前向いてほしい pic.twitter.com/4bN9fJctaG
— おばた (@obaatsu) 2016年3月12日
・LeftArmとRightArmの設定
両手がハンドルの位置に固定されるようにする。
空のオブジェクトをハンドルの両手それぞれの位置に配置し、「Left/Right Hand Effector」のTargetに設定する。
Position Weightは「1」に設定。
・LeftRegとRightRegの設定
両足がペダルの位置に固定されるようにする。
空のオブジェクトをペダルの位置に配置し、「Left/Right Foot Effector」のTargetに設定する。
Position Weightは「1」に設定。
さあこれで基本的な設定は完了!
では再生してみよう!
膝を曲げたときに内側に入るのさえなんとかなれば・・・ pic.twitter.com/izLfYridQX
— おばた (@obaatsu) 2016年3月12日
とまあ膝がうまくいかないわけです。
直しましょう。
膝を曲げたときに内側に向かないよう、Bend Goalを設定。
膝が曲がったときに維持して欲しい位置あたりに空のオブジェクトを作成し、ChainのBend Goalに設定する。
Bend Goal Weightを「1」に設定。
実行したら膝が内側にめり込まず、記事上部のような走り方になるはず。
・モーションの設定
デフォルトのモーションのままだと手が広がったままなので、
POSE02あたりを設定しておくと手が握り状態になるのでいい感じに。
以上です。
ユニティちゃんの髪の毛は動いていないとなびかないので注意。
Final IKの設定方法がメインとなりました。
Unity自体の勉強が知りたい方は下記の本をオススメします!
www.amazon.co.jp
Finak IK 参考:mekaさんサンクス!
machinemaker.hatenablog.com
© Unity Technologies Japan/UCL
【Unity】ArduinoがUSBで接続されてなくてもエラーが出ないようにする
ArduinoがUSBでつながってなかったとき、
IOException: The port `COM5' does not exist.
というエラーで止まってしまっていた。
よくUnityとArduinoの接続には
if (sp != null) {
sp.Open ();
}
のように書いてあるけどダメ。
ということでアレコレ調べてたけど見つからないので無理やりやることに。
方法は有効なCOM番号を配列で取得して、その中に開きたいCOM番号の有無を調べる、といった感じ。
//通信ポート名の取得 string[] ports = SerialPort.GetPortNames(); if(ports.Length > 0){ Debug.Log("有効なポートの数は" + ports.Length + "個だよ"); foreach(string port in ports) { if(port == ポート番号){ Debug.Log(ポート番号 + "はあるよ!"); } } }else{ Debug.Log("有効なポートなんてないよ!"); }
とりあえずこんな感じでフラグを立てることでできた。
正解かどうかはわからないけど、とりあえずやりたいことができたのでOKとする。