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

というわけで、最近やたらと多い「行ってきました」シリーズです。
秋といえば紅葉!ということで、「河口湖紅葉祭り」に行ってきました!

cimg2443_r

去年も来ているので2年連続になります。
前は11月3日に行ったので、今年は2週間ほど遅れて行くことになりました。
3日ではまだ見頃とは言い難い感じであり、今年は色付きが遅いらしいので、時期的にはよろしい感じです。

去年の様子は↓の記事をご参照下さい。

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

もみじ回廊

去年は夜行ったのでライトアップされておりましたが、今年は朝方に来ました。

家を出たときは曇でしたが、河口湖まで行くと綺麗に晴れていました。
が、近隣の専用駐車場は凄まじく混雑しており、9時半には全て満車になってしまっていました。
また、誘導員がかなり適当な誘導をするため、満車のところをぐるぐる回っている車ばかりでした。

仕方ないので猿回し劇場の駐車場に2時間500円で停めることに。
それでもかなり埋まっていたので、紅葉シーズンに行く場合は覚悟した方がよさそうです。

ということで、以下ひたすら紅葉です!

cimg2448_r

cimg2393_r

cimg2407_r

cimg2438_r

cimg2435_r

cimg2417_r

cimg2436_r

人が多いため、家族揃った写真を綺麗に撮るのは厳しいです。
その手のサービスをやっている業者がいたので、抵抗がなければ利用するのが確実です。
大きい写真で出力したものは1000円かかりますが、自分のカメラを渡せば撮ってくれます。

ほうとう不動

山梨県民なのでほうとうにはときめかないのですが、本番のしっかりしたほうとうを食べたことがなかったので、昼に家族で行ってみました。
もみじ回廊の駐車場からは700mほどです。

cimg2453_r

山梨といえばほうとうという風潮がありますが、うどんを更に太くしたような麺なので人を選ぶ食感な気がします。
かぼちゃを溶かして食べると非常に馴染んで美味しくなるのでオススメです。

まとめ

そんなわけで、今年も河口湖紅葉祭りに行ってきました!
秋は寒すぎず暑すぎず、景色も綺麗とお出かけにはもってこいですね。
これから冬にかけて出歩くのもきつくなってくるので、今のうちに秋を堪能しておくべきでしょうか。

【Windows10】電源オプションが正常に表示されない現象と格闘した件について

というわけで、今回は自分のPCでちょっとしたトラブルがあったので、そのお話になります。
いつの間にか電源オプションの項目が正常に表示されなくなり、電源プランの変更や作成も「お使いの電源プランの情報が利用できません」と言われてしまいます。

shot2ss20161119215938247

shot2ss20161119215958327

shot2ss20161119220006969

結論から言うと、レジストリの値がおかしかったのが原因だったようです。
「powrprof.dll」というファイルを見に行っているようですが、そのファイルパスが変になっていました。

以下、自分が試したことを書いていきます!
参考になれば幸いです。

※レジストリを変更した場合、最悪OSが起動できなくなってしまいます。
一切の責任は負いかねますので、変更する際は自己責任で!

試したこと

ぐぐるとよく出るのは、コマンドプロンプトから電源プランの設定を初期化する方法。
以下のコマンドでいけるみたいです。

powercfg -restoredefaultschemes

自分の場合はこれでは解決しませんでした。
powercfg /l で電源プランの一覧を表示すると、下のように普通に表示されるので、完全に逝っているわけではなさそうでした。

既存の電源設定 (* アクティブ)
———————————–
電源設定の GUID: 381b4222-f694-41f0-9685-ff5bb260df2e *
電源設定の GUID: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
電源設定の GUID: a1841308-3541-4fab-bc81-f71556f20b4a

お次はサービス「Power」の確認。
これが無効になっていたりすると表示されないみたいです。

・・・が、

shot2ss20161119224820063

元気に(?)動いておりました!
ぐぐった感じでは、電源プランのメッセージ「RCPサーバーを利用できません」といった旨が表示されている場合はこの可能性が高いかもです。

レジストリ修正

以下のサイトで (Windows7ですが) 似たような事例が紹介されておりました。

http://jutememo.blogspot.jp/2013/01/windows-7-cpu.html

ということでレジストリを疑ってみることに。
弄る前に復元ポイントは必ず作成しておきましょう。

自分の場合、以下のレジストリ直下のキーに原因がありました。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes

ここに2つの値が保存されており、powrprof.dll へのファイルパスが登録されているわけですが・・・

shot2ss20161119225936089

空白部分は自分のユーザ名なので消してありますが、Users\Music\Windows~というなかなかぶっ飛んだパスになっておりました。
これを現在 powrprof.dll があるパスに修正したところ、上手く表示されるようになりました!
カスタムプランも問題なく作れます。

shot2ss20161119231901938

思えば Windows7→10 にアップグレードしたとき、幾つかのプログラムが「Music」フォルダ直下に移動したという珍現象が起きましたが、それの影響なのかもしれません。
また、プラン作成時に「指定されたファイルが見つかりません」と言われたので、それも怪しかったです。
何故アップグレード時に Music に移動したのかは永遠の謎ですが・・・。

しかしこれで終わりではなく、この記事を書いている過程で上で紹介した「電源プランの初期化」コマンドを実行したところ、また Music 下を参照するようになってしまいました。
どうやらデフォルト設定のキーも逝っているため、初期化では解決しなかったようです。
ということで、以下のレジストリ直下のキーも修正しました。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\Default\PowerSchemes

まとめ

そんなわけで、電源オプションが表示されない現象を頑張って調べてみました。
元々は高速スタートアップを無効化しようと始めた作業ですが、レジストリまで弄る厄介な作業になってしまいました。
ともかく正常に直ってよかったです。

重ねてになりますが、壊れても責任は負いかねますので、試す場合は自己責任でお願いします!

【Unity】StateMachineBehaviourからアニメーションの特定タイミングで処理を実行する方法

というわけで、ひさびさにUnity関係のお話です!
今回はタイトルにもある「StateMachineBehaviour」を使ったスクリプトのお話です。

shot2ss20161116195302218

「StateMachineBehaviour」を継承したクラスは、AnimatorController のステートに設定することができます。
主に「ステートに遷移した直後」「ステート中」「他のステートへ遷移する直前」のタイミングで関数が呼び出されますが、「ある特定のタイミングで関数を呼び出す」ということが出来ません。

アニメーションをインポートした際に ImportSettings の Events から出来るようですが、指定する関数名を直打ちするのがあまり好きではありません。
SendMessage() もそうですが、エディタのリファクタリング機能で置換できないので、後々変更があった場合に面倒なことになってしまいます。
アクセス修飾子が private であってもぶち抜いて実行されるのもどうかと思います。

特定タイミングで処理を実行するスクリプトの作成

冒頭で「Events をつかいたくない!」と言ったものの、現状の StateMachineBehaviour に「アニメーションの特定タイミングで処理を実行する」的な機能はありません。
なので自作するわけですが、ステート中に実行される OnStateUpdate() と 、AnimatorStateInfo.normalizedTime を組み合わせればいけそうです。

そんなわけで作ったスクリプトがこちら!

using UnityEngine;

namespace StateController.PlayerAnimator {

    public class ExecuteTest : StateMachineBehaviour {

        [SerializeField]
        protected float execute_time;

        private bool execute_flg;

        public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            execute_flg = false;
        }

        public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            if (execute_time < stateInfo.normalizedTime && !execute_flg) {
                execute_flg = true;

                // 何らかの処理
                Debug.Log("hogehoge");
            }
        }

        public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            execute_flg = false;
        }
    }
}

ポイントは OnStateEnter() と OnStateExit() 内で execute_flg をfalseに設定している部分です。
これがないと execute_flg が true から切り替わらず、2回目以降if文の中が実行されません。
Enter で行えば Exit では要らない気もしますが、念のため!

またif文の条件ですが、normalizedTime が f loat で細かく変化する関係上、「execute_time == stateInfo.normalizedTime」では不可能に近いです。
四捨五入することも考えましたが、近い値になると複数回通ってしまうためNG。

shot2ss20161116202600048

これを AnimatorController 上のステートに設定し、execute_time を設定すればOKです。
AnimatorStateInfo.normalizedTime はアニメーション実行時間に応じて0~1の値を取るので、execute_time も0~1で指定する必要があります。

ただし、ループするステートの場合は上手くいきません。
ループするステートの場合は normalizedTime が1でリセットされず、どんどん加算されていきます。

ということで、normalizedTime 小数点以下を取得して判定するように修正します。
直したのは OnStateUpdate() のif文判定だけです。

using UnityEngine;

namespace StateController.PlayerAnimator {

    public class ExecuteTest : StateMachineBehaviour {

        [SerializeField]
        protected float execute_time;

        private bool execute_flg;

        public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            execute_flg = false;
        }

        public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            if (execute_time < stateInfo.normalizedTime % 1 && !execute_flg) {
                execute_flg = true;

                // 何らかの処理
                Debug.Log("hogehoge");
            }
        }

        public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            execute_flg = false;
        }
    }
}

「剰余演算子」なるものを使えば簡単にできるみたいです。
ちなみに normalizedTime の整数部分がループ回数に相応するようです。
覚えておくと役に立つ・・・かも。

使用例

自分が使っている一例として、「特定タイミングで iTween.MoveBy() を実行しキャラクターを移動させる」があります。
上で載せたスクリプトを少し修正します。

using UnityEngine;

namespace StateController.PlayerAnimator {

    public class MoveCharacter : StateMachineBehaviour {

        [SerializeField]
        protected float execute_time;

        [SerializeField]
        protected Vector3 velocity;

        [SerializeField]
        protected float move_time;

        private bool execute_flg;

        public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            execute_flg = false;
        }

        public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            if (execute_time < stateInfo.normalizedTime % 1 && !execute_flg) {
                execute_flg = true;

                iTween.Stop(animator.gameObject);
                iTween.MoveBy(animator.gameObject, iTween.Hash(
                    "amount", velocity,
                    "time", move_time
                ));
            }
        }

        public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            execute_flg = false;
        }
    }
}

shot2ss20161116202724703

インスペクター上で実行するタイミングと移動ベクトル、移動時間を設定します。
アニメーションの途中で「1歩踏み込んで攻撃」的なモーションがあっても安心です。

20161116_01

実際に動かすと上のような感じ。
分かりにくいですが、縦斬り→薙ぎ払いまで1モーションで、execute_time は0.5に設定してあります。

別に iTween でなくても良いので、animator.gameObject.getComponent() とかと組み合わせればもっといろいろ出来ます。
StateMachineBehaviour のスクリプト内に処理をあれこれ書きたくない方は、素直に Player クラスあたりを getComponent() して処理させるのも有りだと思います。

まとめ

そんなわけで、StateMachineBehaviour 上から特定タイミングで処理を実行する方法について考えてみました!
特定タイミングであれこれしたい場面は多いので、活用する機会は多くなりそうです。

【Blender】boneが逆回転してしまう現象の私的な調査メモ

というわけで、前に続き Blender に関するお話です!
今回はアニメーション設定時に bone が逆回転してしまう現象について調べてみました!

特に縦横にキャラクターを回転させるアクションを作った際に起こりがちです。
自分のように頭身の低いキャラを使っている場合はモロに響く問題です。

どうやら「Quaternion」が関係してくる話のようです。
何とかならないか調べてみたので、その内容について書いておきます!

※書いている人が数学全然ダメなので、問題ないという保証はありません。
試す際は自己責任で!

逆回転するフレームを修正したフレームで登録する

逆回転する部分を手動で補完し登録することで、「内部的に逆回転しているが描画されない」ようになります。
力技っぽいアプローチですが、Quaternion の回転制限を受けずに修正できます。

shot2ss20161112234715154

実際にやってみるとなかなか大変です。
「10フレームかけて1回転する」アニメーションを直す場合でも、逆回転する度にポーズを修正してキーフレームを登録する必要がある上、手動なので動きもぎこちなくなってしまいます。
とは言え、Quaternion にした状態で180度以上回転させるにはこれしかないようです。

boneのRotationModeを変える

そもそもこの現象は、Quaternion が -1~1 の間しか表現できないため、その最短の補完を行う際に起こるみたいです。
角度でいうと -180~180 ですね。
これ以上に回転を掛けようとしなければ発生しないようですが、キャラクターの回転アクションを180度以内で収めるのは無理があります。

このあたりのお話は Unity の公式マニュアルに書いてあります。
https://docs.unity3d.com/ja/current/Manual/QuaternionAndEulerRotationsInUnity.html
https://docs.unity3d.com/ja/current/Manual/AnimationEulerCurveImport.html

shot2ss20161112235006561

で、Blender の bone はデフォルトの回転モードが Quaternion になっているそうです。
これを Euler に切り替えればOKです。

テスト用に作ったウサギちゃんで試してみます。

20161113_02

20161113_01

上は回転モードが Quaternion、下は Euler で、X軸に220度ほど回転させた際の動きです。
Quaternion では逆回転して戻ってしまいますが、Euler ではしっかり1回転してくれます。

shot2ss20161112235208705

この状態で Unity にインポートした場合、Unity 側で自動的に Quaternion のキーフレームを考慮したモーションに修正してくれるようです。
リサンプリングした結果が厳密ではない場合、「Resample Curves」のチェックを外すと Euler のキーフレームをそのまま使えるようです。

ただし、Euler を使うと「ジンバルロック」という問題が発生するようです。
3方向の特定の軸が重なった場合に2方向にしか自由に動かせなくなる・・・的なものらしいですが、自分もよく分かりませんorz
ぐぐった感じでは、1~2軸のみ動かす場合は Euler でも問題ないようです。
Blender の場合は bone ごとに回転モードを選択できるため、逆回転しうるものだけ Euler にするのも有りかもしれません。

shot2ss20161112235339520

また、回転モードを変えた bone はキーフレームを設定し直す必要があります。
(Rotation だけ黄色くなっていない=キーフレームが設定されていない)
モーション作成中に変えると面倒なので、アニメーション系の作業に取り掛かる前に決めておくのがよさそうです。

まとめ

そんなわけで、Blender で bone が逆回転する現象について調べてみました!
かなり難しい話題なので、また何か分かったら考えてみます。

日本平動物園(とその周辺)に行ってきました!

というわけで、3エントリー連続で旅日記!
最早「ゲーム開発日記」が詐欺のようなブログです。

今回は日本平動物園とその周辺に行ってきました!
内陸県民故か、海に憧れるのもさることながら、日本平動物園にアザラシがいるという情報を見過ごすわけにはいきません。
前々から行ってみたかったこともあり、有給をもらって平日に行ってきました。

cimg2163_r

山梨から国道52号線をひたすら南下し、新清水ICから東名高速に乗りました。
日本平周辺までは片道2時間ほどです。
そろそろ長距離ドライブや高速運転にも慣れていきたいところなので、その練習も兼ねていたりします。

何故か途中から(カーナビのせいで)県道10号線に入ってしまい、無駄に狭い道を通る羽目になってしまいました。
素直に国道52号線を通るほうが確実で安全です。

三保の松原

日本平動物園には午後行きたいため、まずはその周辺の観光です。
三保の松原と言えば、日本三大景色とまで言われる場所です。

cimg2167_r

cimg2174_r

cimg2171_r

松は有名なだけあって大きくて立派です。
風景的には曇りだったので富士山が見えず、残念ながら微妙でした。

cimg2172_r

実は浜辺まで出たのは人生で初めてだったりします。
太平洋の水平線に感動を覚える内陸県民です。

日本平山頂

cimg2188_r

三保の松原から日本平パークウェイへ向かいました。
日本平パークセンターに駐車場があります。

cimg2194_r

山頂からは先ほどの三保半島と松原が見えます。
上から見ると「半島」という感じがしますね。

cimg2208_r

日本平パークセンター側は太平洋が見えます。

景色自体は非常に良いのですが、いかんせん曇り空とは合いません。
紅葉も散ってしまったのかあまり見えませんでした。
三保の松原もそうですが、来た時期とタイミングが悪かったようです。

日本平動物園

cimg2215_r

本日のメインにして本命です。
お目当てはアザラシですが、純粋に動物園自体好きなのでいろいろ見てきました!

日本平山頂方面から日本平パークウェイを通って行きましたが、日本平動物園入り口が何故か右折禁止だったので、下の方まで降りてUターンすることになってしまいました。
入場料は600円ちょっとですが、駐車料も600円とられるので、1人で行くとそれなりにお金が掛かります。

cimg2216_r

cimg2218_r

なかなかシャレオツな自販機ですね!
ヤクルトが売っている自販機って何気にレアではないでしょうか。

cimg2221_r

cimg2221_1_r

レッサーパンダです。
「パンダ」とだけ言うとジャイアントパンダと間違えられるため、小さいという意味で「レッサー」パンダと名付けられたそうです。
どの動物園いっても人気者なイメージですが、ここのレッサーパンダも活発で可愛かったです。

cimg2263_r

cimg2264_r

ゴマフアザラシです!
色々な角度から見られるように工夫されており、特に筒状の水槽を上下するアザラシは筆舌に尽くしがたいです。
ここだけで30分ほど釘付け状態になってしまいました。

cimg2272_r

cimg2277_r

ライオンのオスとメスです。
オスがひたすらメスの毛づくろいをしていました。
随分と仲のいいカップルですね。

cimg2293_r

cimg2300_r

モルモットとウサギです。
特定の時間にふれあい広場にいくと触ることができるようで、ちょうど良い時間に行くことができました。
自作ゲームのウサギもどきとは違い、白くてモフモフで可愛かったです。

cimg2305_r

cimg2308_r

べネットアカクビワラビーです!
カンガルー好きとしてはワラビーも非常によろしいです。
ずっと草を食べていましたが、1匹だけ遠くで黄昏ていました。

cimg2313_r

シカです。
自分が行った瞬間に振り向き、そのままずっと見られていました。
正に「こっち見んな」という状態です。

cimg2330_r

サイです。
ちょうど2頭が頭同士をぶつけあって(?)いました。
ちなみに左がオスで、右がメスらしいです。

cimg2350_r

キリンさん!
昔はキリンが最も好きな動物だったのですが、アザラシにとって代わられてしまいました。
今でも動物の中では割と好きなほうです。

ぐるっと回ったところで、15時から始まるアザラシの餌やりを見ました。

cimg2368_r

cimg2372_r

飼育員にタッチして餌をもらっていました。
トレーニングの一環らしいです。

cimg2376_r

3匹が頭を出して餌待ちしている姿は微笑ましいですね。
ちなみに並び順は一定で、年功序列のようです。

餌やりが体験できるとのことで、自分もサバを投げてみました!
写真には撮れませんでしたが、ダイレクトにガブッと食べていました。
平日で人が少なかったからこそ出来たのかもしれません。
アザラシ好きとしては貴重な体験でした!

清水パーキングエリア

昼食を抜かしていたので、帰りに清水PAに寄ってみました!
「パーキングエリア」という割にはしっかりした建物があり、レストランやショップも充実していました。
その中でチョイスしたのはこちら!

cimg2380_r

「富士の卵を使ったとろとろ親子丼」です。
自他共に認める鶏肉好きなので、こういう親子丼があると飛びついてしまいます。
グルメレポートは得意ではないので一言でまとめますが、「超」美味しかったです。

cimg2382_r

また、親へのお土産として「特濃牛乳シュークリーム」を買ってみました。
外はパリパリ、中はふんわり濃厚クリームです。
シュークリーム故に長持ちはしませんが、保冷剤で4時間くらいはいけるそうです。

まとめ

そんなわけで、日本平の方に遊びに行ってきました!
県外まで出かけるのは大変ですが、斬新で面白い発見がたくさんあります。
時間と心に余裕ができたらもっと遠出したいです。