主なコンテンツ

〜主なコンテンツ〜

1. Unityで製作したゲームと製作Tips
  1. 三月精チャレンジ(東方Project二次創作)
    1. 作り方
  2. 英語学習2D(オリジナルスマホアプリ)
2. UE4
3. ゲームアプリ見学
4. Bitbucket & SourceTreeでの一連の流れ
  1. 前半
  2. 後半
5. Tips
  1. UnityのTips
  5. SQL文のTips
  6. Final IK
  7. GearVR+Unity

2016年12月22日木曜日

遅れてついてくるカメラについて

単純そうで意外と奥が深かったので、知識をこつこつまとめていく。

  • Smooth系とLerp系について
    • Mathfについての解説(参考
    • unity smoothdamp vs lerp(参考
      • smoothは曲線補間、lerpは線形補間とのこと
    • Unity側はsmoothdampを想定している(参考
  • 処理を行うUpdateの種類について
    • まずは基本のおさらい(公式:イベント関数の実行順
      • この情報自体が正しくないという話もあるので、あくまで基本
      • この図を見るとUpdate前に必ずFixedUpdateが呼ばれているように見えるが、FixedUpdateは固定フレームの物理演算用のUpdateなので通常のUpdateとは非同期
    • RigidBodyの処理はFixedUpdateで行う(参考
      • このことはFixedUpdateのリファレンスにも書いてある(参考
    • カメラの追従はLateUpdate推奨(参考
    • 低速での追従でどうしてもガタツキがでる現象について
      • FPSを意図的に落としてFixedUpdateで呼び出す(参考

    今回、ロボットの頭に追従するカメラを作成したが、最終的に次のようにした。

    2016年11月14日月曜日

    Final IKについて(その15)

    ■Interaction System Part 4




    • 今回扱うInteraction Triggerは、オブジェクトに対して特定の位置でかつ特定の向きを向いているか判定するためのもの
    • 大きめの球体オブジェクトを用意する
      • Interaction Triggerコンポーネントをアタッチ
        • Rangeに要素を追加
        • このときシーンビューに可視化するかチェックボックスが現れるので有効にする
        • Cahactor PositionのUseを有効にする
        • Radiusを1
        • 最大角度を40くらいに
      • 掴みたい球体の子オブジェクトにする
        • ローカル座標は0に
    • 6:40付近で予告なしに、Interaction TriggerのInteractionに設定を加えている
      • ボールのInteractionObjectを指定し、Effectorに右手を指定
    • キャラクターにカプセルコライダーとrigidbodyをアタッチ
      • Rigid BodyはisKinematicを有効にしておく
    スクリプト作成
    • IsInInteractionが引数必要になっており、エラーが出る
      • inInteractionで代用した
      • 結局、該当部は不要なので消すことになる
    • キャラクターが指定角度の時でかつ、指定範囲内にいることを判定できる
      • 緑の半透明な球体がInteraction Triggerのコライダー
      • 紫の範囲はこのコライダー内にある必要がある

    • orbitを有効にする
    • Fix Y Axisを有効にすると、Interaction Triggerを持ったオブジェクトが回転しても、仰角俯角は変化しなくなる
    • 解説通りに進めて、Eボタンを押しても反応しない
      • 6:40付近の設定が抜けているため

    VRデモ

    • あとはこのデモを見ながらさらっとした解説になる
    • Camera PositionのLook at Targetにオブジェクトを指定すると、それがカメラが範囲内にあるか判定できる(FPSやVRで使う)
    • ボタンはキャラの向きと、カメラの位置で判定するのが一般的とのこと
    • ボタンのInteraction SystemのTriggeringにも指定必要(?)

    Final IKについて(その14)

    ■Interaction System Part 3




    • キャラクターを複製
    • ボタンの位置に合わせて手の形を作る
    • 成形した手をシリンダーの子オブジェクトにし、複製したキャラクターを削除する
    • 子オブジェクトにした手にInteraction Targetをアタッチ
      • Effector Typeを右手にする
    • シリンダーの一番の親にInteraction Objectをアタッチ
      • Weight Curveを追加し、山なりにする
      • Multipliersに要素を追加し、Multiplierを1、ResultをRotate Bone Weightにする
        • 同様にもう一つ追加し、ResultをPoser Weightにする
      • Eventを追加し、0.5秒の時Poseするようにする
    • キャラクターの右手にHand Poserをアタッチ
    • Interaction System Test GUIをキャラクターにアタッチし、Effectorを右手にする
    • シリンダーにAnimatorを追加する
      • ボタンの動きを作成する
      • Animatorに空のアニメーションステートと、ボタンの動きのアニメーションステートを追加する(ボタンのステートにはInteraction Objectの機能で移動できる
    • Interaction Objectに戻り、EventのAnimationに要素を追加
      • Animatorは先程作ったもの
      • Animation Stateに対応する名前を記入
      • Reset Normalized Timeを有効にする

    Final IKについて(その13)

    ■Interaction System Part 2

    *part1の続き





    • Interaction ObjectコンポーネントのEvents>Messageに要素を追加し、Fanction名をOnPickUpとする
    • GameObjectにはボール自身を選択する
    • スクリプトを作成し、ボールを持った時の位置にオフセットを加えられるようにする(スクリプトは動画参照)
    • キャラクターの向きが変わったとき、ボールもその向きに追従するようにする
      • Vector3にQuaternionを足しているとしか思えない処理をする。
    • Vector3で作ったholdOffsetを、OffsetPoseに変え、LateUpdate内に書いたholdOffsetを使用した箇所はコメントアウトする
      • OffsetPoseをアタッチし、EffectorをleftHandにする
      • Pinは足元を原点として、ホールドするローカル座標を決めるもの
    • RigidBodyとShpiaColliderをボールに追加
      • RigidBodyのisKinematicは有効にしておく

    2016年11月13日日曜日

    Final IKについて(その10)

    ■Aim IK Redirecting Animation




    • Aim IKをアタッチ(動画のinspector古い
      • Clamp Weight、Clamp Smoothing、Tolerance(許容誤差)を0
      • Use Rotation Limitsのチェックを外す
    • ボーンを追加し、背骨(Spine)と首(Neck)を指定する
    • Last Spine Bone に子オブジェクトを追加する
      • ここでは首に子オブジェクトを追加するらしい
      • 座標はすべて0
      • これをAim IK のAim Transformに指定する
      • 動画中触れられないが、AxisはAim Transformの向きに合わせる(第3回のチュートリアル参照)

    スクリプトの作成

    • 名前空間にusing RootMotion.FinalIK;
    • このころのinspectorにTargetの項目がないから、処理を自作している
    • aimIK.solver.IKPosition = target.position + offset;とすることで、スクリプトでAim先を調整できるようにする
    • これを応用することで、Aim先にレイを飛ばし障害物を考慮したアニメーションが可能になる
    • 完成品のスクリプトは動画の説明文にあり、動画内では解説しない

    Final IKについて(その7〜9、10)

    ■Custom IK Rigs
    CCDコンポーネントを使うことで、多脚の脚や戦車の砲台などもIKでコントロールすることができる。

    ■Full Body Biped IK Troubleshooting
    後半は最初の回と似たような内容だった

    ■UMA Integration
    スクリプトでFBBIKをaddComponetするときの注意点

    ■Interaction System Basics
    第4回とほぼ同じ

    ■Combining IK Solvers (Aim + FBBIK + LookAt)
    おさらい&内容が古いので割愛

    • 前回のAimのキャラクターにFBBIKをアタッチ
    • guaranteeの意味は保証
    • initiatedの意味は開始
    • budgeの意味は身動きする
    • LookAtIK初登場
      • Hand Weightを1
      • Headに頭を指定


    ■Interaction System Part 2
    Interaction ObjectのEventsのMessageを使って、特定オブジェクトにメッセージを送る(メソッドを呼び出す。IEnumeratorも呼べる)
    ボタンを押したときにボールを離すこともやる。

    ■Interaction System Part 3
    アニメーションとの連動

    ■Interaction System Part 4
    相互干渉範囲の指定

    Final IKについて(その6)

    ■FBBIK Grounder




    • Full Body Biped IK (以降FBBIKと略される)のアタッチされたキャラクターにGround FBBIKをアタッチする。(検索では略語になっていない
    • 歩きたい場所のレイヤーを指定する(動画ではDefaultとした)
      • キャラクターのレイヤーは除外すること
        *excludeの意味は除外する
    • IKに歩行するキャラクター(=キャラクター自身)を指定する
    • ちなみにanimatorのroot motionで歩かせると障害物を無視して進んでいった(root motionの仕様なのだと思うが情報つかめず)

    パラメーターについて

    • Max Stepがオフセットの最大値を決定する
    • Predictionが大きいほど、より遠くの障害物の形状に合わせようとする
    • Pelvis speedが大きいと上下への移動が速くなるらしい(あまり実感できず)
      • Pelvisの意味は骨盤
    • Rotation Solverが有効になっていると、キャラクターの回転に合わせて壁や天井の地形にもフィットするようになる
      • キャラクターの上方向が常にVector3.upであるなら、この機能は無効にしたほうが良い
    • Spineに要素を追加し、肩などの部位のweightを設定すると、段差や坂を登るときその角度に合わせて体が曲がるようになる
      • キャラクターが坂を向いているときのみ機能するらしい(判定は甘そう)

    2016年11月12日土曜日

    Final IKについて(その5)

    ■Full Body Biped IK - Linking Effectors to Objects

    *前回の内容と似ているが、この回では簡単なスクリプトを書く




    • Full Body Biped IKをアタッチ(厄介なことに動画のinspectorは旧式
    • Cubeを配置し、コライダーを削除する
    • ゲームをいったん再生状態にする
    • 右手と左手のEffectorのWeight PositionとRotationを1にする
    • 箱を持った状態になるよう、手の位置や角度を調整する
    • Full Body Biped IKにより手の位置は固定できているが、指の位置は固定できない
      • そこで、手の調整が終わったらゲームの再生を一時停止にする
        • 重要なのはAnimatorの非アクティブなので、こちらはあまり気にしなくてよい
      • このとき、Animatorを非アクティブにしないと調整できない(Animatorに上書きされる)
      • この状態で指のボーンを調整する(ゲームの再生をやめれば元に戻る)
    • 調整が終わったら、両手をコピーする
    • ゲームの再生を終える
      • ボーンの調整はかなり時間のかかる作業なので、前回同様キャラクターを複製して編集したほうが無難に思う
    • コピーした両手をCubeの子オブジェクトにする
      • 位置情報のみで視覚的には何も表示されない

    スクリプトの作成

    • 名前区間にusing RootMotion.FinalIK;
    • 作成したスクリプトをキャラクターにアタッチ
    • 指先を再現するためには、同梱されている「Hand Poser.cs」をアタッチし、Pose RootにCubeの対応する手の子オブジェクトを指定する 


    2016年11月11日金曜日

    Final IKについて(その4)

    ■InteractionSystem Part 1




    • Full Body Biped Ikをアタッチ
    • 球体のオブジェクトを用意
      • コライダーを削除
      • Interaction Objectをアタッチ
    • Interaction Objectの設定
      • Weight Curveのsizeを1にして、設定を入力できるようにする
      • TypeはPosition Weightのままで良く、Curveはクリックして次のように設定する。このとき、キーはダブルクリック(もしくは右クリック>Add Key)で追加できる。キーを右クリック>Edit Keyを使うと直接数値を入力出来て便利。
    • キャラクターに戻り、Interaction System Test GUIをアタッチ(これにより、Interaction Systemもアタッチされる)
    • Interaction System Test GUIの設定
      • Interaction Objectに先ほどの球体を指定する
      • Effectorsのsizeを1にして、Left handにする
    • ゲームを再生するとゲームビューにボタンが追加されている。このボタンを押すと、球に手を伸ばす動作が再生される。
    • 球体に戻り、Interaction Objectの一番下にあるEventをsize1にする
      • timeに0.5、ポーズにチェックを入れると指定時間で一時停止するようになる
    • Multiplierのsizeを1にする
      • Multiplierを1にする(これが影響度なので、0のままだと何も起こらない)
      • ResultをRotate Bone Weightにする(Rotation Weightでもいいらしい)
      • これで再生すると、手を捻って触れようとする。この回転はInteraction Objectがアタッチされている球体のRotationに依存している。xの向きの逆を向こうとしているように思える

    • 再生中に編集した設定は、コンポーネント名を右クリック>Copy Componentしておけば、再生後に再度右クリックで値をペーストできる


    球体の特定の位置に手を置きたい場合

    • キャラクターを複製する
    • 複製した手のパーツだけを球体の任意の位置に移動させ、指も含めて手の形を子のみの状態に調整する
    • 手を球体の子オブジェクトにする
    • 複製したキャラクターを削除する
      • このとき、子オブジェクトにした手も見えなくなるが問題ない(親のマテリアルがなくなったため透明になった?)
    • 子オブジェクトにした手にInteraction Targetコンポーネントをアタッチする
      • Effector Type をleft handにする
      • この状態でゲームを再生しボタンを押すと、先程の手の形を再現するようになる
    • キャラクターの手にHand Poserコンポーネントをアタッチする
    • 球体のInteraction ObjectのMultiplierのsizeを2にする
      • 追加した要素のResultをPoser Weightにする
    • ゲームを再生すると、球体に手を置いたとき指の動きが固定される
      • ここで球体の子オブジェクトの手の形を修正する
      • 修正が終わったら、手の子オブジェクトをコピーする
      • ゲームの再生を終え、手の子オブジェクトを削除してから、先ほどコピーした手のオブジェクトをペーストし、球体の子オブジェクトにし直す

    キャラクターの位置が変わったとき不自然のないように修正

    • 球体子オブジェクトのInteraction TargetのPivotに球体を指定する
    • これによりキャラクターの位置に合わせて、手を置く位置が変わる。尚、これは手を伸ばしたときの話であり、ボールに触れた状態でキャラクターを移動させても手の位置は変わらない
    • Rotate Onceのチェックを外すと、常に位置を修正するようになる。

    Position Offset(実演無し)

    • 球体のInteraction ObjectのWeight Curveに要素を追加し、Typeをposition offset Yにする
    • Curveを0.25秒のとき値が0.25くらいになるようにする(形は動画参照)
    • Position Offset Spaceに何か指定すればそちらをオフセットにできるといっているが、実演無し
    • 試しに球体を指定してみたところ、2回目以降は球体が回転しなくなった(手を置く位置が再現されなくなった)

    Reach

    • 手の動きを制限できるようだが、良く分からず

    ボールを取る

    • 球体のInteraction ObjectのEventをポーズからpick upに変える
    • これによりボールを取って、キャラクターの手の子オブジェクトにすることができる

    Final IKについて(その3)

    ■FINAL IK TUTORIAL - Basics of Setting Up AimIK




    • Aim Ikコンポーネントをアタッチ
    • Aim Transformには銃や手などを指定する。銃であれば先端に空の子オブジェクトを配置し、それを指定するとよい。
    • Aim Transformの下にAxisがあるので、これをAim Transformに指定したオブジェクトのローカル軸と合わせる
    • Bonesで指定できるボーンを追加できるので、ここにspine(背骨)のボーン(3つある?)と、neck(首)のボーンを指定する
    • この時点でゲームを再生すると、ターゲットが自動的に用意されテストすることができる。Mecanimeでアニメーションを再生していても銃口はターゲットを向いている。
    • この状態だと体がのけぞるので、Animatorの修正が必要。
      • UpperBodyレイヤーを作成し、アニメーションを追加
        • 元のレイヤー:Standing Breathe(腕を下げている)
        • 追加したレイヤー:Standing Front(銃を構えている)
      • projectに「Avatar Mask」アセットを作成(Upper Bodyと名付けた)
      • インスペクターで下図のように下半身を無効にする。(緑の部分のみ再生:参考
      • 先程作成したマスクに指定し、レイヤーのweightを1にする

      • 背骨の影響度が1だと背骨もターゲットに向くような感じになり、かなり不自然になる。影響度は低めにして姿勢が崩れないようにした方が自然。
      • 標的が真後ろ近くにあるとかなり強引に腰をひねってしまう。Clamp Weightを0.5くらいにすると自然な角度で必要以上に追従しなくなる。
      • 腕が不自然なのは後で修正する

    Pole Targetの解説

    • Game Objectを新たに作成し、Pole Targetに指定する
    • ターゲットのAxisの時と同様に、Pole Axisを設定する
    • Pole Weightを1にする
    • これにより、追従する軸を追加することができる(ターゲットを狙いながら体を45°傾けるなど)

    更に修正

    • Upper Arm, Fore Arm, Handのボーンを更に追加する
      • どうもこれは、子オブジェクトである必要がありそう(親子関係の不明な孫オブジェクトは指定できない模様) 子オブジェクトが複数(兄弟オブジェクト)ある場合は、それを無視して孫オブジェクトを指定できない模様。
      • 連なったボーンになる必要がある模様

    2016年11月10日木曜日

    Final IKについて(その2)

    ■FINAL IK TUTORIAL - FullBodyBipedIK Inspector




    • Position Weightで位置を動かす
    • Rotation Weightで回転させる
    • これは複数の個所を同時に固定することも可能
    • 度々出てくるsolverはIT用語で、目的の値を逆算する機能のこと
    • インスペクターの変数名にカーソルを乗せると詳しい説明が表示される
    • コンポーネント名のところ右クリックで、ユーザーマニュアルなども参照できる
    • 「Fix Transform」「Root Node」とその下の「Weight」「Iteration(反復)」「use Thigh(タイ=大腿)」についての解説(聞き取れず)。実演しなかったので、あまり気にしなくても大丈夫かも。
      • Fix Transform:強制的に姿勢を矯正する機能
      • Root Node:中心となるソルバ。WeightとIterationは影響力。
    • Body以外にはBend Goalというパラメータがあり、これにオブジェクトを指定することで、その位置に引っ張られる感じにできる
    • 分からないところは、コンポーネント右クリックでユーザーマニュアルへ。対応するコンポーネントのマニュアルに飛べるよう。

    参考
    • その1(UnityのHumanoidの仕組みやIKについて)
    • その2(AutoDeskのIKソルバについて)

    Final IKについて(その1)

    同梱のReadmeにチュートリアルページなどへの案内が書いてある。このチュートリアルを見るのが初めにやることになりそう。ちなみに、Shared Demo Assetsの中にダミー君がいる。

    動画の内容(全15回)

    *リンク先はこのブログの該当記事
    1. 基本操作について(このページ)
    2. インスペクターについて
    3. 武器を標的に向ける
    4. 物を掴んで子オブジェクトにする
    5. 物を掴むここから字幕&スクリプト
    6. 地形に合わせて歩く
    7. rigの調整やカスタマイズ
    8. トラブルシューティング
    9. UMA Integration
    10. アニメモーションが地形にめり込むのを回避
    11. 相互干渉システムの基本的な使い方
    12. Aim + FBBIK + LookAtを組み合わせる
    13. 相互干渉システム音声のみに戻る
    14. 相互干渉システムでボタンを押す
    15. 相互干渉できる角度や距離の指定

    ■FINAL IK TUTORIAL - Basics of Setting Up FullBodyBipedIK




    • Bipedとは「2足歩行動物」のこと
    • AnimatorのUpdateModeはNormalかAnimate Phisics
    • FullBodyBipedIKをアタッチしても、動画のような青いパーツは現れない。...と思ったが、何かの拍子に表示された。
    • MMDを変換したFBXのAnimation TypeはGenericでも良いはずだが、アタッチするとRootNode以降が表示されない。Humanoidにしたら大丈夫なようである(参考)。
      • Humanoidのときの内容と比較してみたところ、Referenceの一部が違っていた。Humanoidと同じにしてみたところ解決した。
      • この影響か不明だが、修正が終わった後で他のキャラクターを見てみたところ、Aim IKコンポーネントが修正した初音ミクのFull Body Biped IKに上書きされていた。早めにプレハブにして、何かあったときに戻せるようにした方が無難かも。Unity内でFBXを複製したせいかもしれない。...気づいたら直っていた。青いパーツが表示されなかったりと、反映が遅いような仕様があるのかもしれない。
    • limbの意味は「四肢」
    • 肘、膝には小さな矢印があり、これが赤で異常を示しているときは、少し角度を調整すれば直るらしい
    • ゲームを再生 > Left Arm > Position Weight を1 > 表示された四角をダブルクリックで、左手を引っ張ったりできるようになった。
      • これはロボットの膝の矢印が外を向いていておかしな動きになることを示すためだったよう。FullBodyIKのインスペクターを固定して、膝のジョイントを修正する。
      • このとき、膝の上と下の線が直線になるようにし、膝の矢印は真正面を向くようにする。

    参考

    2016年11月9日水曜日

    AssetStoreの利用規約

    アセットの利用権限について調べたら、思いの外苦労した。購入しようとしているアセットに独自ライセンスがあればそちらが含まれ、特に何も表示されていなければAssetStoreの利用規約が適用される。

    このAssetStoreの利用規約は今のところ英語しかない。法的な話なので読むのが辛いが、コピーを禁止しているのでプロジェクト単位で使う必要があるとだけ知っておけば大丈夫だと思う。

    【追記】
    ...と思ったが、コピーしなくても一度購入すればプロジェクトまたいでインポートできるから、ユーザー単位かもしれない。

    UnityのGameビューが荒く見えるとき(Scaleの問題)

    Unity5からだと思うが、Gameビューにscaleが追加された。これ自体は便利なのだが、無意識にマウスホイールしていると、気づいたら何故か画質が悪いという事態に陥る。原因が分からず、カメラや設定などを見直してしまった。


    2016年11月8日火曜日

    GearVR + Unityについて

    Unite2015のGearVRの講談資料

    開発の導入は基本はこちらに従う。OculusがUnityの推奨バージョンを公開しているので意識しておいた方がよい。


    ■Oculus Signature File

    GearVRはOculusとSamusunが共同開発したデバイス(参考)。なので、GearVRでも「Oculus Signature File」という署名ファイルが必要。この設定にデバイスIDが必要なのだが、ひどく手間取った。

    このデバイスIDとは出力先のAndroid端末のIDのこと。USBで繋いで、端末側の「USBデバッグ」を有効にしておく必要がある。その他嵌りそうなポイントはこちら。なお、adbコマンドはどのディレクトリからでも使える模様。コマンドはdevicesなので注意。

    ■カメラ周りの仕様(+映像周り)

    • VRに使われるカメラはMainCameraではなく、Depthにおいて一番手前にあるカメラ(参考
    • カメラのtransfromはVR装着時に上書きされる(参考
    • Quality SettingsのLOD Baisは開発時は1にしておき、ビルド時のみ2にすると良い(VRでは画面が2分割されるので、開発画面の画面比率100%はVRの場合50%となるため)
    • 冒頭のUnite2015資料の通り、画面が2分割されるので描画負荷が2倍になる

    ■UI関連

    • UIで使えるのはWorld Spaceのみ(参考
    • CanvasのRender Modeを一旦「Screen Space-Camera」にして、MainCameraを指定して、UIとの距離を指定してから、Render Modeを「World Space」する必要があるっぽい。ただし、私の場合はうまく行かなかった(尚、Screen Space-CameraScreenについてはこちら
    • 普段通りに作ってから、scaleを0.01くらいにする。(参考:Unity uGUIを使うには)
    • カメラにUIを張り付かせると不快感が強い(参考

    ■デバッグ関連

    • Unityのプロファイラー

      • 手順
        1. 出力する端末のIPアドレスを取得しておく
        2. アプリをDevelopment Buildでビルドする
        3. アプリの起動している状態で、Windows>Profilerでプロファイラーを開く
        4. Active Profilerに先程のIPアドレスを入力
      • 接続できているのに出力が更新されないとき(参考
        • 一旦アプリを終了させる
        • 別アプリ関係なく更新が止まること多々あり
      • プロファイラー結果の出力(参考1
        • エクセルなどには出力できない
        • 基本的にはエディタ拡張を使う
          • 手順
            1. Profiler.enableBinaryLog = true;としたうえで、Profiler.enabled = true;とすることで、自動的にログと詳細な不可データ(.data)が指定フォルダに出力される
            2. 何も表示されていないプロファイラ画面を開く
            3. エディタ拡張でProfiler.AddFramesFromFile(ログファイル名);とすると、プロファイラ画面にデータを読み込ませることができる

    • GearVRの開発者モード

      • これをONにするとHMD(HeadMountDisplayの略)を使わなくても2分割画面で起動できる(参考
        • Android6.0では下記だった
          • [Settings (設定)] > [Application] >[Application Manager] 
          • [Storage] > [Manage Storage]
      • HMDに接続しなくても良いものはこれでOK
      • 開発者モードの切り替えの下に「アプリリストにアイコンを追加」という項目もある。これをやっておけば次からアクセスが楽になる。アイコンを起動した画面の右上の「その他(More)」を押す。

    • Wifi経由でADBを取得する

      • Wifi経由でMonitorにてログを確認できる(参考
      • adbコマンドの際は実機が待機画面でないこと!Oculus Signature Fileのとき同様、嵌りポイントに注意。
      • HMDに接続しなきゃいけない場合に利用
      • adb usb でUSBモードに戻すときは、Wifiで端末に接続出来ているので、USBをつながなくてもよい(繋ぐと1個以上のデバイス/エミュレーターが確認されたと出てエラーになった)


        ■ゲームパッドについて

        • 基本的にはどのパッドも同じキーが割り当てられている(こちらのゲームパッドを使うには参照)
        • 例えば、右ジョイスティックを使いたい場合
          • Edit>Project Settings>Inputに移動
          • sizeを増やして、追加できるようにする
          • ジョイスティックのHorizontalやVerticalを参考にして、Axisを4th axisなどにする
          • 名前はHorizontal2などにするとよい
          • スクリプトで使うときは、Input.GetAxis("Horizontal2")のようにする
        • 製品名+Unityでググれば、きっと誰かが検証してくれているはず
          • Steel Series
            • 自分のコントローラーはLR=4, 5だった。(X Boxと同じ気がする)

        ■影について

        • シャドウカスケードはモバイルプラットフォームでは使えない(参考
        • ソフトシャドウはモバイルプラットフォームでは使えない(参考
        • この二つが使えないだけで、下図のような影響がある(最高画質の設定で比較)
          • 下図のカメラの角度だとこのように映る。真上から映すともう少し綺麗に描写される。

        ただし、Shadow Distanceを短くすると改善される。(この影響が非常に大きい)


        • 代案:Dynamic Shadow
        • 代案2:巨大スケールをあきらめてShadowDistanceを小さくする
          • カメラに映る大きさの比率で決まっているため無意味
        • 嵌りポイント
          • LightのResolutionがミディアムになったままで若干ハマった。LightとQuaritySettingsの両方を最高品質にする必要あり。というか、LightのResolutionは「Use Quality Settings」にしておけば間違いがない。
          • VRのせいではないのだが、Unity上では問題ないのに、VR内では物体の近くまで接近しないと影が表示されない問題に悩まされた。Edit>Project Settings>Qualityで画質設定が確認できるのだが、AndroidはSimpleとなっている。SimpleのShadow Distanceは20であり、巨大な世界観だと今回の問題が起きた。

        ■負荷の削減など

        • DINOTOWNのスマホ移行(参考

        ■Oculus Utilities for Unity

        過去はUnityでOculus系のVR開発をするのに必要だったが、ver.1.3.0でOVRPluginが切り離され、これがUnity側に統合された(Unity5.3.4p5  以降)。そのため、現在では外部プラグインが不要となっている。ただし、両者のバージョンアップに対応するための最低限の部分の統合であり、意図的に機能は制限されている。(参考)。

        外部プラグイン無しで開発できるが、Oculus特有の機能を使いたい場合はOculus Utilities for Unityを使ってね、というのが現在の構図となっている。
        • ダウンロードはこちら
        • リファレンスはこちら
        • リリースノートのKnown Issuesにて、その冒頭文とGearVRの欄を確認しておく(使うべきでないUnityのバージョンが指定されている)

        GearVRは戻るボタン長押しで動画やスクリーンショットが撮影できるとあるが、このbackボタンの挙動もOculus Utilities for Unityに含まれている(Oculus助け合い所にて回答あり)。backボタンの挙動追加はこちらbackボタンの挙動がないと審査で落ちるらしい

        尚、紹介したサイトではOVRManager自体にカメラをトラックする機能は無いとあったが、現在は自動で目の前に表示するようになっていた。なので、ボリュームUIをカメラに追従させる仕組みは自前で用意しなくて大丈夫。 


        Unity内のカメラは自動的にOVRCameraRigプレハブに置き換わるようで、現在のこのプレハブには初めからOVRManagerがアタッチされている。なので、用意しなくてもボリュームUIは実装されている。この流れでいえば、いずれOVR Platform Menu もプレハブに内包されるかも…。

        センサーが使いたかったが何故か値が0だった。どうやらUnity側のバージョンアップで修正されたらしい。日本には情報が無いので海外のフォーラムを探すことになりそう(参考)。

        ■その他

        • Unity VR リファレンス(参考
        • タップ操作は自作する必要あり(フォーラムの内容を流用するのが現状。参考
          • Unity 5.4以降で動作しない模様(参考
          • Unity公式のチュートリアルに従うことになりそう(参考
            • Vurtual Reality Supportedにチェックが入れられない場合はunityを再起動する(参考
            • 日本語での解説(参考
            • 3つの主要なスクリプト
              • VREyeRaycaster
                • メインカメラに配置
              • VRInput
                • タップやスワイプなどを判定する
                • イベントについてのチュートリアル(参考
              • VRInteractiveItem
                • VRで対話したいオブジェクトに付ける
                • コライダーが必要




      • 動画やスクリーンショットの撮り方(参考

        • VR端末の戻る長押しでメニューを開けるらしいが、これが出来ず...。上記の通り、Oculus Utilities for Unityを導入して、backボタンの挙動を追加する必要があった。
        • 尚、動画を撮っても音は録音されないとのこと。説明書には録音できるとあるが、誤記らしい(Oculus助け合い所にて回答あり 2016.10.12)。





      • 解像度は2560×1440(参考






        • 再生時にVRの視点にする(参考
        • そのうち役に立ちそうな情報集(参考
        • ASTCは高画質な圧縮形式のこと(参考


            WindowsのCPUとGPUの確認方法

            CUP(参考
            GPU(参考)とその型番(参考

            2016年11月7日月曜日

            Unity IAPを試す(その2)

            基本となるのは次の2つの資料。
            1. Unityチュートリアル(参考
            2. Unite2016Tokyoトレーニングデイ(スライド
              1. 19ページ目にサンプルデータのURLが示されている
              2. 「購入ボタンと購入APIを紐づける」にてサンプルデータのPurchaser.csが要求される
              3. このPurchaser.csはUnityチュートリアルのPurchaser.csに日本語訳を添えたものであり、内容は同じだと思われる
              4. Workshopと名の付くものが練習用、Completeと名の付くものが完成見本だと思われる

            主にUnite2016Tokyoトレーニングデイに従い、テストしてみる。気になった点のみ抜粋する。
            • Unity IAPのインポートで導入されるのはPluginsフォルダのみ
            • IStoreListener を継承することでUnity Purchasing からメッセージを取得できる
            • BuyProductID(nameID)でアイテム購入
              • 非同期でProcessPurchase か OnPurchaseFailedが呼ばれる
            • 成功時はProcessPurchase(PurchaseProcessingResult型で引数がPurchaseEventArgs型)が呼ばれ、このメソッドの中に各種アイテムが購入されたときの処理を書く
            • アイテムIDはInitializePurchasingの中でも使われている
            • ストアのIDはそれに対応する変数に記入する
              • 例えばGooglePlayなら「kProductNameGoogle~」の方に記入する
              • InitializePurchasing内にて、ストアIDと汎用IDの結びつけが行われている
              • スライドにてアイテムを登録するところで触れられているので一読のこと
            • GooglePlayのラインセンスキーを入力する話が無い(参考

            Unity IAPのメリット
            • クロスプラットフォームであり、デバイス別の記述をしなくてよい

            Unity IAPを試す(その1)

            Unity IAP(In App Purchaser)でググると情報が見つかる。
            今回は2016年11月にノンコーディングになったらしいのでそれを試す。(参考ドキュメント

            IAPボタンの作成は、window→serviceからUnity IAPをインポイートした際に同梱されるEditorに含まれている模様。

            閑話

            ビルド時にDevelopment buildを外し忘れて、Google Play Developer Consoleのアップロードで弾かれた。


            また、消費アイテムの登録に戸惑った。管理対象アイテムにして、ゲーム内で消費するようにとのこと。(参考

            あと、アンケート式レーティングは保存ではなく、算定→適用。

            実機にapkをインストールするとき、「名前とは異なる署名のパッケージが既にインストールされています」と出てインストールできなかった。原因は他のアプリのBundle Identifierが重複しているためらしい。「com.~.app2」のように名前を変えたらインストールできた。(参考

            閑話休題

            ドキュメントに従い、IAP Buttonを追加する。追加後にやることは概ね下記の3つ。



            1. ボタンが押されたときに購入されるアイテムIDの登録
            2. 成功時のイベント
            3. 失敗時のイベント


            試しに成功時と失敗時はログだけ表示するようにして、Unity上でテストプレイしてみた。


            さて、これをAndroid実機で動かしてみたところボタンは反応するが、成功にも失敗にもならない。どうやら初期化の時点でエラーが出ているらしい。よくよく考えれば、Google Playの公開鍵すらUnity上で設定していない。

            というわけで、従来のやり方を調べてみる。
            次回

            参考

            2016年10月31日月曜日

            AndroidStudioでGoogle In-app Billingを試す(その2)

            前回の記事はこちらです。

            再度、購入しようとしてみたところ「エラー 指定したアイテムは購入できません。」と出た。公開しないといけないらしい(参考)。公開といっても製品版でなければ、テストユーザー内に公開ということになる。


            公開できない理由を見ながら、すべての項目を埋めていく。アイコンの用意などがあるので、これらはフリー素材を借りてリサイズした。公開が完了するまでには数分から数時間かかる。

            公開が完了したが、依然としてエラーは解消されない。

            閑話

            再度、英語の手順を確認してみると「IInAppBillingService.aidl」を追加しなければいけないとある。AIDLとはAndroid Interface Definition Languageの略で、これがGoogle Playサービスへのインターフェースを定義しているとのことだ。

            ただこのAIDLはサンプルのTrivialDriveには既に含まれており、自作のアプリを作った際はこのサンプルのAIDLをコピーして使う方法について書かれているだけである。

            言い始めれば、このGoogleのトレーニングはTrivialDriveを通してアプリ内課金の方法を理解するものではなく、自作のアプリにTrivialDriveのAIDLを使ってアプリ内課金を実装するものだったようだ。

            尚、「IInAppBillingService.aidl」は下図の場所にあった。Googleがアプリ内課金で提供しているメソッドが書いてあった。


            閑話休題

            アプリを「クローズドアルファ版テスト」で公開したのだが、テストアカウントをリストに登録するだけでは不十分で、オプトインURLにアクセスする必要があった。

            テストしたいアカウントでオプトインURLにアクセスすると次のように表示され、これでようやくコンソール(アプリ内アイテム)の更新が反映されることとなった。


            有効になったテストアカウントで購入をしようとすると、次のように表示される。この時点で既にテスト用の注文であることが表示されてくれる。


            尚、iPhone移行前に使っていたアカウントだと次のように表示された。


            「Buy Gas」で"gas"の購入。「Upgrade My Car」で"premium"の購入(車が青から赤になるらしい)。「Get Infinite Gas」で"infinite_gas_monthly"か"infinite_gas_yearly"の購入のようだ。


            尚、コンソールにアイテムが登録されていない場合でも「認証が必要です。Googleアカウントにログインしてください。」と表示されるようだった。実体とエラー文が異なるのでかなり注意。


            このときAndroid Device Monitorに表示されるErrorを含むログは次の2文。

            2016年10月27日木曜日

            AndroidStudioでGoogle In-app Billingを試す(その1)

            こちらのフローに従う。日本語だとこちらが良さそうだった。

            sampleをAndroidStudioで起動させるとエラーが発生した。

            Failed to find: com.android.support:appcompat-v7:21.+
            Install Repository and sync project

            こちらの通り、Android Support Repositoryを追加したところ直った。
            SDK Managerがどこにあるのか分からなかったので、AndroidStudioの検索で引っ掛けた。
            Android Support Repositoryはここにある。


            簡単に調べてみたところ、Android Support Repositoryに含まれる「Google Repository」が必要だったらしい。

            エラーは消えたが画面に何も表示されないので、左のprojectや下のmonitorタブを開いてあげる必要がある。次はMainActivity.javaを修正する必要があるらしいが、それがどこにあるか分からない。下図の場所にあった。


            閑話

            上部メニューのRun>Run"app"でエミュレーターで実行が可能(参考)。
            エミュレーターが起動すると、実機のような画面となるが、実行するアプリが立ち上がるまではかなり時間がかかる。また、Trivial Driveは実行できずにすぐに閉じてしまった。

            なお、この問題とは別だと思うがアプリ内課金のテストは実機でしか行えない(参考)。これは、通信が端末のGoogle Playアプリを通して行われるかららしい(参考)。

            閑話休題

            次に、Google Play Developer Consoleにこのアプリを追加して公開鍵を手に入れることになる。Android Studioで署名付きapkを出力する方法はこちら

            ただし、パッケージ名が「com.Sample.***」となっているため、このままだとGoogle Play Developer Consoleで弾かれる。Android Studioで修正するには、下図のAndroidManifest.xmlの該当箇所を右クリックでrefactor→renameする(参考1参考2)。ただし、ダイアログに従うだけでは置換されず、左下のDo Refactorを押して初めて置換された。


            この際、下図のbuild.gradleのapplicationIdは置換されていないので、ここは手動で直す必要がある。


            これを直したらリビルドしてから、署名付きapkを出力する。尚、出力先に既にapkがあっても「上書きしますか?」とは聞いてこない。

            注意点(参考
            1. apkのTypeはリリースにした方が良いらしい
            2. コンソールにアップロードする必要があるが、テストであればアルファ版でも良いらしい(参考
            3. テスト用のアカウントを事前に登録しなければ、課金が発生してしまう(登録の仕方)。尚、テストアカウントを登録しても通知などはこない。
            4. アプリ内課金をするアカウントは住所の登録が必要
            5. コンソールへの反映には時間がかかる
            次にアプリ内アイテムの登録を行う。登録はコンソールの「アプリ内アイテム」から行う。販売者登録がまだの場合は、先にそちらを済ませるように言われる。項目はフルで埋める必要がある。途中のチェックボックスはチェックを入れておいた。



            アイテムの追加は冒頭の解説を参照のこと。
            尚、

            • gasが管理対象外の商品
            • premiumが管理対象の商品
            • infinite_gasが定期購読

            とのことである(参考)。これは途中から変えることができないので注意。IDも再利用できない。

            これが終わったらサンプルの公開鍵を修正する必要があるのだが、Android Studioで再度プロジェクトを開こうとしたら「Cannot load project: java.lang.NullPointerException」というエラーが出て開けなかった。

            Android Studioのbin(本体のあるフォルダ)にある「idea.properties」をメモ帳で開き、末尾に「disable.android.first.run=true」を追加して再起動したところ、本当に直った(参考)。管理者権限でないと操作できなかった。また直接上書き保存ができなかったので、いったん追記したものをデスクトップに保存した後、ファイルを置き換えた。

            修正したapkを実機にインストールし、ガスを購入しようとしたところ「エラー 認証が必要です。Googleアカウントにログインしてください。」というエラーが出た。端末の「設定>アカウントと同期」を確認してみたところ、アカウントが同期していないかった。

            尚、今回のサンプルはこれで解決したが、別アプリにてアプリ内課金時に同様のエラーが出てGooglePlayの入れ直しなどを行った(参考)。


            >>次回に続く。


            日本語での解説記事っぽいもの。
            その1(冒頭に移動)
            その2(女の子の絵のサイト)
            その3(Androidアプリ開発!:Main Activity内の処理を日本語で説明)
            その4(EGG)
            その5(Wander Planet)

            途中で見つけた気になる記事。(解決策は次回とあるが、次回はない模様)

            2016年10月21日金曜日

            【unity】 Installation failed with the following output:

            Unityで実機にビルドできないときのエラーの一つ。
            Installation failed with the following output:について。

            ググるとandroidで対応する最下位のバージョン指定と、実機のバージョンが合わないことが原因とある。次に引っかかるのはzipalign.exeについて。

            ただ、どうやら実機で何か問題が起こっている場合、それを解決しないとこのUnityのコンソールにこのログが出てビルドが失敗する模様。実機のシステムメモリが不足しているときにこのエラーが出て、アプリを削除してメモリを確保したところビルドに成功した

            2016年10月5日水曜日

            C++について


            • 派生クラスを作る際、基底クラスにアクセス修飾子をつける意味(参考

            2016年9月13日火曜日

            JsonUtilityについて

            JsonUtility

            高速だが高機能ではない。
            Unityのシリアライザが対応していないものはシリアライズできない。
            • 配列
            • List<object>
            • Dictionary
            • UnityEngine.Object
              • ただし、ScriptableObjectを含む一部オブジェクトは可能

            EditorJsonUtility

            UnityEngine.Object を JSON に変換するのに必要。
            • Editor専用
            • 配列には対応しておらず、文字列を連結して使う工夫が必要

            ISerializationCallbackReceiver



            http://anchan828.github.io/editor-manual/web/data_storage.html

            http://hatena.phalusamil.com/entry/2015/12/10/201509

            2016年9月8日木曜日

            C++テスト環境をcocos2dxで作る(Windows)

            Windowsアプリのみを試したい場合、こちらのサイトに従って進めていく感じになる。
            WindowsでVisualStudioを試した際の記事はこちら

            1. cocos2dxをDLし、任意の場所に解凍
            2. pythonをインストール
              1. 「python --version」は綴りが間違ったのか実行できなかったが、問題なかった
            3. cocos2dxのフォルダ内にあるsetup.pyをコマンドラインから実行
              1. Androidの設定はスキップできる
            4. コマンドラインにてcocosコマンドを用いて新規プロジェクトを作成
              1. 新規作成はコマンドライン(ターミナル)から
              2. 初回時のみ改善のためのデータ提供の同意(たぶん)を求められる



            1. proj.win32\MyGame.slnをダブルクリックするとVisual Studioがあれば、それが起動する
              1. ビルドを実行し、次にデバッグを開始する。これでアプリケーションが実行され、Hello Worldが表示される。
            2. Hello Worldのソースについて(参考
              1. AppDelegateクラスの理解は後回しでよい
              2. class HelloWorld : public cocos2d::Layerは、 名前空間内のcocos2dの中のLayerをHelloWorldに継承させるということ。C++の表現なので要学習。publicが付いているのは公開派生(参考)。
            3. その他
              1. 基本図形の描画の仕方(参考
              2. updateの作り方(参考1参考2
              3. C++11の乱数の生成(参考1参考2
              4. FPSの表示を消す(参考
              5. #ifndefとは(参考
              6. USING_NS_CCはcocos2dの名前空間を呼び出している。cocos2d::Vec2とかを省略して書くときに使う。
              7. C++でべき乗は ^ の記号が使えない。同じ数を複数回掛けるか、POW関数を使う。ただし後者の戻り値はdouble。
              8. switchで「制御の転送は次の初期化をバイパスします」というエラーが出る。→case内をスコープする({}で囲む)と良い
            4. exeとして出力(参考


              その他参考
              https://www.honeycomb-lab.co.jp/lab/blog/?p=226
              http://www.fujimi-labo.com/2016/03/29/gamedev01/
              http://studio.cretia.net/blog/185
              http://oimodx.hateblo.jp/entry/2014/06/25/215427

              2016年9月2日金曜日

              Unityでの爆発シミュレーション

              http://d.hatena.ne.jp/tueda_wolf/touch/20120111/p2

              http://tsubakit1.hateblo.jp/entry/2015/10/18/002452

              http://tsubakit1.hateblo.jp/entry/20140713/1405183951

              http://tsubakit1.hateblo.jp/entry/2014/10/02/034911

              その他、後ほどまとめたいもの

              • https://speakerdeck.com/unitydojo/unitydao-chang-shaderforge101



              2016年8月27日土曜日

              UnrealEngine4動作環境

              動作環境

              wikiに必要スペックなどTipsが載っている。ドスパラさんのを買うのが良さそうか。

              フォーラム


              • Facebookの助け合い所は管理者が見ていないようで承認が下りない
              • 英語ではあるが、UE4Anserhubが情報収集や質問の場として一番良さそう

              2016年8月25日木曜日

              Unreal Engine 4 の学習 (DAY2)



              お題目

              • Third Personテンプレート
                • ヘルスの処理をBPで作成
                  • イベントAnyDamageを配置
                  • 変数Healthを配置
                    • Cntr+D&Dでゲットで配置(MacはCommand)
                    • Alt+D&Dでセットで配置
                • ヘルスバーを表示
                  • 新規追加でフォルダを追加
                  • フォルダ内で右クリック>ユーザーインターフェイス>ウィジェットブループリントを作成
                  • パレット>共通>progress Barを配置
                  • 詳細>Progress>バインド>バインディングを作成
                    • 右上のデザイナー>グラフのグラフ側がオレンジになる

                    • イベントグラフタブを開く
                      • 右クリックでGetPlayerCharacterを配置
                      • 右クリックでcastと検索し、ThirdPersonCharacterへキャストを選ぶ
                      • キャストの出力で変数に昇格する
                    • 次にGetPercentタブを開く
                      • 先ほど昇格した変数を配置
                      • 0:39:40 ~ 0:42:28までクラッシュ対応
                    • フォルダのThirdPersonBP>Blueprint>ThirdPersonGameModeをダブルクリック
                      • ブループリントエディタを開く

                      • イベントBeginPlayを配置
                      • ウィジェットを作成(UIを作るためのノード)
                      • classのドロップダウンリストから先ほど作ったPlayerUIを選択(新規フォルダに作成したウィジェットブループリント)
                      • Add to ViewPortを配置して完成
                • 敵ユニットの作成
                  • コンテンツブラウザのThirdPersonBP>Blueprintに新規BPクラスをアクターで作成
                  • ダブルクリックでBPエディタを開く
                  • コンポーネントを追加>スタティクメッシュコンポーネント
                  • 詳細のstatic meshにてShape_Cylinderを選択
                  • Construction ScriptでSetRelativeLocationを配置
                    • Construction Scriptはインスタンス生成時に実行される処理。
                  • 座標のピンを右クリックで分割を選択

                  • タワーの頭をプレイヤーに追従させる(1:12:00)
                    • イベントグラフタブ
                  • 弾を作成する
                    • 新規BPをアクタークラスで作成(これが弾となる)
                    • コンポーネント追加でSphereコリジョンを追加
                      • コリジョンプリセットをBlockALLに変更
                    • コンポーネント追加でCommonから球を追加
                      • こちらはただの外観なので、コリジョンプリセットはNoCollisionに変更
                    • Projectile Movementを追加
                    • レベルに配置して確認
                      • この辺りからエラーが出るようになるが無視して進める(動画でもエラーが表示されている)
                      • バウンドしない
                        • コリジョンをDefoultSceneRootにD&Dする(13:33:00)
                  • 弾を頭から発射する
                    • Arrowコンポーネントを追加し、「頭」の子にする
                    • イベントグラフにカスタムイベントを配置
                    • 「クラスからアクターをスポーンします」を配置
                    • 変数内にあるコンポーネントの、先ほど作成したArrowをgetで配置
                    • イベントBeginPlayの接続先をSet Timer by Function Nameにする。Function Nameは直接入力
                  • 動く敵を作る
                    • 新規BPをキャラクターで作成
                    • ブレークポイントの作成
                      • ブレーク後にゲームを止めるには、BPエディタ内上部にある「停止」ボタンを押す。ただ、動作が不安定でボタンが反応しない時がある。イベントグラフ内を右クリックをすると治る時があった。

                    • Nav Mesh BoundsボリュームはレベルのビューポートでPキーを押すと、正常にビルドされた範囲が緑色で表示される(参考)。
                  • マテリアルを作る
                    • 3キーを押しながら左クリックでVector3をショートカットで配置できる
                    • ノードへの色の反映は10秒ほど時間かかる
                  • 連続爆発
                    • Alt+クリックでリンクの解除
                    • ディレイノードを追加
                    • DoOnceのリセットに接続する
                  • ゲームオーバーを作る
                    • GameOverUIにテキストとボタンを配置
                      • イベントグラフにOnClickedを配置し、リスタートするようにする
                      • Restart Gameノードは「状況に合わせた表示」のチェックを外さないと出てこない
                    • ThirdPersonGameMode
                      • カスタムイベントを配置し、詳細にてインプットにDeadというboolean変数を用意する
                      • GameOverUIウィジェットをAdd to Viewportするようにする
                    • ThirdPersonCharacterカスタムイベントを配置
                      • GetGameModeを配置し、そこからドラッグし、ThirdPersonCharacterにキャストする
                      • 先ほど作成したGameoverイベントを呼び出す。この時Deadにチェックを入れる。
                      • Set Show Mouse Cursorに接続し、チェックを入れる
                      • Set Input Mode UI onlyに接続する
                    • ゴールの作成
                      • 新規BPをアクターで作成
                      • Text Renderはまだ日本語対応されていない
                        • Horizontal Alignment(水平整列)を中央にする
                    • GameOverUIに処理を追加
                      • 右上のグラフを選択

                      • マウス操作のみにした後に、ThirdPersonGameModeへキャストし、結果を変数として出力するようにする
                      • 一旦、コンパイルしてからデザイナーに戻り、テキストのConentにてバインドを選択すると先ほど作成した結果の変数が表示され、そこからさらにThirdPersonGameModeで作成したGameOverMessegeがプロパティとして選択できるようになっているので選択する
                • プレイヤーから弾を発射する
                  • 編集>インプット>BindingsにてShootを作成し、左クリックを対応ボタンとする。これによりShootというアクションイベントを呼び出せるようになる。
                  • 玉がThirdPersonCharacter以外に当たったらDestroyするようにするが、この処理を加えると自分と接触しているのか弾が出なくなる。時間がないのでこれにて講義は終了となる

              2016年8月24日水曜日

              Unreal Engine 4 の学習 (DAY1)



              お題目

              • 基本操作
              • 横スクロールアクションの作成
                • BP内で右クリック+マウス操作で摘んで移動
                • BPを用いたエレベーターの作成
                  • 可動性を「ムーバブル」にする必要あり
                  • 可変フレームレートなのでdelta secondsをかける
                    • delta secondsは前回から何秒後に呼び出されたかを返す
                  • タイムラインを追加する(2:30:00)
                    • フロートトラックを追加
                    • Shift + 左クリックでキーを追加
                    • タイムラインはフレームレート非依存
                  • タイムラインをAddRelativeLocationにつなぐ
                    • イベントティックの切断(2:37:10)
                  • ノードを複数選択した状態でCキーを押すと、名前をつけてひとまとめのブロックにできる
                • 奥行きの移動追加
                  • 編集>プロジェクト設定>インプット>Bindings>Axis Mappingにて奥行き操作を追加(ここではMoveDepthとした)
                  • BP内で右クリックし、検索で「MoveDepth」とすると先ほど追加した軸イベントが選択可能になっているのでこれをBPに配置
                  • AddActorWorldOffsetで動かす
                    • 横スクロールなので、奥行きXの値はどこかで0を入力しているらしい。滑らかに動かしたい場合は、CharactorMovement選択時の詳細に表示されるPlanarMovomentのConstrain to Planeのチェックを入れた上で、AddMovementInputを用いる。(4:16:00)
                • カメラの位置を変える
                  • カメラもSideScrollerCharacterに含まれている。ビューポートタブをクリックしカメラを動かす。

              2016年8月1日月曜日

              日本語学習カードゲーム



              ポーカーのようなルールで、長い文章を作った人が勝ち。買おうかな…。(参考

              映画「ゲーム・オブ・スローンス」


              デンマークの友人がお勧めしていた映画。スローンズ(thrones)は王位の意味。これは映画ではなく連続ドラマとのこと。魔法の存在する架空の中世ヨーロッパを舞台に王位争いが繰り広げられる。

              これだけ聞くと単なるファンタジー物に思えてしまうのだが、先の読めない展開と人間の泥臭さを濃密に描いておりアメリカで賞を総なめしたとのこと。時間があるときに見てみたい。(参考

              2016年7月21日木曜日

              プリンセスメーカー(iOS版)レヴュー


              以外と古くからあるタイトルの最新作。コンスタントに続編を出しており、その都度一定の評価を得ている。プリンセスメーカー1のTAS動画でこのタイトルを知った。タイトル通り、預かった娘をお姫様にするのが主な目的。…なのだが、自由度がかなり高くお姫様をすっ飛ばして王位を継承したり、魔王になったりできるのが本タイトルの魅力。

              ついに3Dが導入され、体型を反映できるようになったり、太り過ぎるとドレスが着れなくなるなどの要素が足された。ニッチな層を相手にしているので話題にならないのは致し方ないが、過去シリーズの動画を見てかなり興味を持ったのでやってみた。

              【結論】
              ゲームが起動しない。


              このゲームの内容以前の問題で、かなり評価を落としている。この時の運営の対応も良くなかったらしい。またプレイできた人からしてみても、課金がエンディングに関わるのに否定的な感情があるようだ。基本無料のビジネスモデルはゲームによって向き不向きがあるので、基本無料が向かないゲームの新しいビジネスモデルの開拓が望まれる。

              このゲーム、PV通りならストーリー性が強く、ガチャ要素がなく、3Dで動き回れる要素もあるようなので、かなり光るものがあったように思う。それだけに、ゲームが起動しないのは残念だった。もう少し粘って、起動できないか試そうと思う。(追記:無理そう)

              ちなみに、声優が非常に豪華だった。

              プリンセスメーカーは監修は同一人物によって行われているが、開発元は統一されていない模様。今回はエムゲームという韓国の企業であったため、ローカライズの際に技術的な問題があったのかもしれない。なお、この企業のサイトにプリンセスメーカーが存在していない(汗。

              <追記 (2016.07.22) >

              再インストールをしようとしたら、今度はバッチファイルのDLが完了しなかった。以降はOPがスキップできず、ファイルのロードも発生せずだった。技術的に問題がありすぎる。

              2016年7月13日水曜日

              WindowsでC言語

              Xcodeでは結局Windowsのコマンドプロンプトから実行できそうになかったので、書いたソースをWindowsでビルドすることにした。

              ■Visual Studio

              「苦しんで覚えるC言語」にはVisual Studioが紹介されていたのでこれを使おうとしたが、Xcodeで書いたソースがデバッグもビルドもできず、その理由がコンソールに表示されなかった。Visual Studioの開発用コマンドプロンプトにてclを用いてビルドした時は、サポートされていない文字が使われている({}の記号)とのことだったが、エラーの行が対応していなかった。

              そもそもVisual StudioでC言語を使いたくてもC++を選ぶ必要があり、C言語の開発に向いているのか確信が持てなかったため使用を諦めた。実際、情報が少ない。

              ■Eclipse

              バージョンに星の名前が使われていて困惑した。Indigoが最新版とのこと(参考)。うまくいくかと思われたが、MinGWのインストールができずに詰んでしまった(shlink.jsが見つからないと出る)。

              ===

              Visual StudioでC言語


              最終的にVisual Studioでやることにした。
              *「空のプロジェクト」での方法(参考)。
              - 実行後のコンソールが一瞬で消えるのを変える際は、ソリューションエクスプローラーのプロジェクトを右クリック。(参考
              - #define LEN 100;とすると、コード中のLENが100;とセミコロン付きで置き換わってしまう。
              - 実行の際は上部メニューの「デバッグ>デバッグなしで開始」
              - Ctrl+K, Ctrl+Cで一括コメントアウト(参考
              - 出力ログへの残し方(参考
              - ブレークポイントで止めた後は、 F10で先に進める
              - printf (参考)

              2016年7月9日土曜日

              MacでC言語(Xcode)

              とりあえず、「苦しんで覚えるC言語」を元に勉強。基本的にはこちらのサイトのやり方で良さそう。方々でgccのインストールの話が上がっているが、特に何もしなくてもCommand line toolからC言語での開発が始められた。

              試しにfopenでtest.txtを出力してみたが、どこに出力されているのか分からなかった。ユーザー名/Library/deveroper/Xcpdeの中のプロジェクトフォルダに出力され散る模様。こちらにあった(参考)。


              なおこのパス先には、Xcode開発画面の左にあるProductsのビルド済みファイルを右クリックし、Show in Finderすることでも辿り着けた。

              ターミナルから実行する際には、実行ファイル名の前に./をつける必要がある(参考)。

              mallocによる動的生成には#include<stdlib.h>が必要(参考)。

              fwriteの第二引数と第三引数について(参考

              2016年6月27日月曜日

              iOSアプリのアップデート

              基本的な流れ(参考

              上記リンク先の通り、iTunesConnectにバージョンアップの申請をする場所がある。この申請をしないと、X-codeでValidateは通るが、Upload to App Storeは通らなかった。


              アップロードすると、「プッシュ機能つけてない?」というメールがまた届いた。

              ビルドされたかは、アクティビティから確認できる。よく見ると「(処理中)」と書いてあるので、これが外れるまで待つ必要がある。ビルドが終わればメールが届くので待ちぼうける心配はない。


              ビルドが終われば、申請したバージョンアップにこのビルドを登録できるようになっている。あとは変更内容を記載した上で、審査に提出すれば良い。

              2016年6月25日土曜日

              uGUIの描画順をスクリプトで変更

              チュートリアル代わりにヘルプボタンを作ってみた。カテゴリボタンの存在を伝えるのが目的。下図のようにヘルプボタンがuGUIの一番最後に表示されるようにしたい。


              しかし、このようにするとメニュー画面の上にも表示されるようになり具合が悪い。そのため、スクリプトでこれを制御することにした。内容は単純に、①メニュー表示時にヘルプボタンの描画順をメニューの描画順の前にする、②メニュー非表示時にヘルプボタンの描画順を一番最後に戻す、というもの。

              これにより、描画順をスクリプトで切り替えられるようになった。下図Gifアニメのヒエラルキーに注目。


              なお、このGifアニメで分かるようにヘルプボタンの描画順はメニューの直前ではなく、2つ前になっている。これはおそらくヘルプボタンの描画順が最後でなくなったことで、メニュー画面の描画順が繰り下がったためだと思われる。このことから、メニュー画面の描画順をヘルプボタンの描画順にすれば、メニューの直前にヘルプボタンを描画できると思われる。厳密な操作が必要な場合は注意が必要。

              今回は仕様をアテにするのが怖いのと、厳密な操作が不要であったため、前述のようなスクリプトにした。

              2016年6月21日火曜日

              名刺の自作について(ラベル屋さん)

              個人用の名刺が必要になったので作ってみた。エーワンという会社が売っている台紙を購入し、ラベル屋さんというサイトで加工するのが一般的なよう。



              ラベル屋さんにはweb版のソフトがあり、インストール不要でデザインを作って印刷できる。一連の手順は公式動画で説明されており特に迷うところはない。



              ただし、Macでweb版を使用すると位置がずれる。そのためMacの場合はインストール版の使用が推奨されている(参考)。

              2016年6月20日月曜日

              Unityでアプリをリリースするまでの道のり【英語学習2D】

              *動画の下に目次があります。



              目次

              1. Live2Dを使ってみる with Mac(その1その2
              2. ExcelのデータをScriptableObjectに変換する
                1. ScriptableObjectの基礎理解
                2. NPOIとエディタ拡張(その1その2
                3. クエリやラムダ式を使ってみる
              3. SQLiteUnityKitを使ってみる with Mac(その1その2その3
              4. uGUI周り
                1. エディタ拡張でuGUIを更新
                2. 各端末に解像度を対応させる
                3. InputFieldについて
                4. VerticalGroupについて
                5. Textについて(その1その2
              5. AudioSourceの管理について
              6. 実機
                1. iOS
                  1. 実機テスト
                  2. リリース
                  3. バージョンアップ
                2. Android
                  1. リリース
                  2. バージョンアップ
                  3. バグ対応(SQLiteのAndroid用プラグインの不具合)
              7. リリース後
                1. AdBuddizという海外の広告会社について
              8. アップデート
                1. uGUIの描画順をスクリプトで変更する

              AnimatorのInterrupt Sourceについて

              意外とヒットモーション時に足を止めるようにするのが難しかった。最初はAnimatorStateInfoでアニメーションの終了を検出しようとしたが、ステートの遷移が含まれると正確に判断できないため断念した。これは2Dのように遷移を補完しないアニメーション向けのようである。

              次にノックバックなどのアニメーションクリップの再生時間を取得し、Invokで再生時間後にストップを解除しようとした。しかし、Animatorの再生速度を加味する必要があったのでこれも断念した。

              最終的にアニメーションイベントでストップを解除するようにした。ただし、ヒット中にもう一度攻撃を受けると、ステート推移の影響でアニメーションイベントがギリギリ読み込まれる事態が生じてしまった。

              つまり、
              1. 1回目のヒットアニメーション冒頭でストップフラグが立つ
              2. → 2回目のヒットアニメーション冒頭でヒットでストップフラグが立つ
              3. →1回目のアニメーション終了時のイベントがギリギリ読み込まれ、ストップフラグが解除される
              となり、2回目のヒットアニメーション中の途中から動けるようになってしまった。AnyStateからの推移はCan Transition to Selfにチェックを入れてある。長いことAnyStateを疑っていたが、問題はヒットモーションから待機状態に戻る際にInterrupt SourceがNoneになっていることだった。つまり、ヒットモーションから待機状態に遷移する際に、この遷移が中断されないせいで待機アニメーション終了時に仕込んだアニメーションイベントが呼ばれていた
              Interrupt Sourceについては公式マニュアル参照。とりあえず中断させたければ、None以外にすれば良さそう。今回は、ヒットモーションを繰り返して欲しかったのでCurrent State then Next Stateにした。


              これにより、いわゆるハメの状態が可能に。処理としてはこちらの方が正しい。あとはハメ対策としてダウン値を設けるなどの工夫をすれば良い。