セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

Github An unexpected error has occurred

・An unexpected error has occurred
・failed to refresh the working directory

ああなんて恐ろしい言葉なんだろう、、、、、

原因は様々あると思いますが、ネットの’情報が少なく、原因の特定方法にすら苦労したので、すでに解決してしまいスクショなどは皆無だけれど、一応書き残しておきます。

環境

・主に作業で使っていたMac(Sierra)
・久しぶりにSyncしたら上記のエラーが発生したWindows(10)


やってみたことその1

Windows側のデータを削除して、cloneをしてもらう

結果:同じエラー

やってみたことその2

Github Desktopの再インストール

結果:同じエラー

やってみたことその3

Macで新しいgitアカウントを使い、cloneを実行

結果:エラー出ず、通常運転

やってみたことその4

Macでプロジェクトをエクスポート->Windowsでインポート

結果:プロジェクト内のフォルダ名が、読み取り不可になっていた。


最終的に

フォルダを削除したら、無事cloneが成功。MacWindowsでの文字コードの違いから起こったエラーではないかと予想。直すのに必死で、全くスクショを取っていなかったので、事後報告になってしまった笑 ただ、よく思い返したら、エラーが出ていた際のログファイルにも、文字が読めませんでしたニュアンスのログが残っていた気もする。。。。その時はスルーしちゃったけど(だってMacで普通に動いていたし、、)ログファイルは一応しっかり読もう。

 今回のようにMacWindows間の文字のトラブルは意外と多いので、Gitで共有している時に、謎のエラーが出たらまずエクスポートを使用して、unityのエラーとして把握できると、gitで無造作にエラーを出されるよりは、解決の糸口が見つかりやすいかもしれない。


f:id:thinline196:20170110215856p:plain

Unity アルファ値の指定(メモ程度)

アルファ値を動的に変更する場合、直接アルファ値を変更しようとしてもエラーがでる(いつもここで迷う笑)


正しくは、

    float alpha=1;
    obj.color=new Color(obj.color.r,obj.color.g,obj.color.g,alpha);


値の範囲は0~1で指定する。別にアルファ値だけでなくて、色自体も変更可能

Unity - スクリプトリファレンス: Color

Unity ScrollViewをフリックで操作する

タイトル通りです。

フリックを検知する

こちらのサイトさんが参考になりました。

Unityでフリック入力 - Qiita

改良した点は、フリックの方向もわかるようにしたこと。といっても、それほどいじったわけではなく、タッチの始まり点と終わり点のx座標の差をとって、方向を調べているだけです。後はそれに準じて、別のメソッドを呼んであげたりすることで、方向もしっかりと検知することができました。何よりしっかりとしたスクリプトを載せていただけていたのですごく勉強になりました。


ScrollViewをフリックで動かす

 ScrollViewを使用する必要はないです。僕はScrollVewを作成した後、改良しようとして今に至っているので 使っているだけです。ScrollViewを使用しない場合は、コンポーネントを綺麗に横(縦)に並べて、それをフリックによって左右に移動させてやればOKです。(iTweenが良いよ)

まず、ScrollView固有のスクロール機能を切ってしまいます。ここの2つのチェックw外せばOK
f:id:thinline196:20170108202259p:plain


こうすることで、コンポーネントをContentの中に詰めたとしても、それが移動することはありません。
後は、先ほど作成したフリック検知スクリプトより、移動メソッドを読んであげればOK



nowPanelは現在表示中のパネルを記憶し、端のパネルがさらにスクロールしそうになったらreturnする為に使用します。後は、パネル間の距離を算出し、その分だけ全てをiTweenで移動させてやります。これで、フリックに対応したScrollViewができます。







結論を言うと、なんらかの方法でパネルを縦か横に並べ、それをフリック検知により移動させてあげれば、操作できているような感覚になります。

Unity ダメージ表示UIを作る

RPGとかでよくあるやつ!9999みたいな!さて腰を据えて作ろうかなと思って10秒経たずに素晴らしいサイトを見つけてしまった笑 トップに表示されるぐらいだから、おそらく誰もが一度は見たことあるであろうサイトさんですが、、笑

[Unity] FF4、FF5のダメージ表示アニメーションをUnityで再現する | きききろく

僕のFF魂をくすぐりました笑 もう参考にさせてもらうしかない!


ベースはありがたく使用させていただくことに

Animationなんてチュートリアルで触って以来です。ただいい機会なので慣れておきたい。サイトさんにはここら辺の設定は割愛されていたので自分なりにとりあえずシンプルに実装して見た。

f:id:thinline196:20170107182237p:plain


y座標を少し移動させるだけ!多分、同じことをやっている笑 終了判定のスクリプトはほぼそのまま使用させていただきました。こちらの終了判定は、のちに実装するフェードアウトを、全ての数字が表示し終わったタイミングで実行するために使用されています。


メインのスクリプトの方は若干いじらせてもらいました。具体的には、スクリプトを初めからダメージ管理オブジェクトにつけて置いて、DamagePopUp()メソッドに引数としてダメージとワールドの表示場所を渡して呼び出せば、いつでもダメージのアニメーションが表示されるようにしました。




スクリーン座標の計算

ダメージは当然、受け手付近に表示させなければいけません。参考にさせていただいたサイトさんはこちら。

UnityのCameraが使う3つの座標系 - テラシュールブログ
【Unity】【uGUI】Screenの座標とWorld(3D)座標の変換について - テラシュールブログ
スクリーン座標の取得 凛(kagring)のUE4とUnityとQt勉強中ブログ


結果的には、MainCameraのWorldToScreenPoint()メソッドを使用することで、なんの苦労もなくできてしまいました。この時注意することは、MainCameraぐらいです。普段使用しているcameraオブジェクトのtagをMainCameraにして置いてください。そうすることで、スクリプト上から Camera.main でアクセスできてしまいます。今の所、カメラを複数使用していないので、なんのエラーもなく座標を変換することができました。



、、、先人さんたちに本当に感謝です。

Unity 再生中のAudioSourceのclipを上書きして放置

 タイトル通りです。
 
 今までは音が流れればいいや確認できればいいやの流れであまり気にせずやってきましたが、実際にスマートフォンなどで動かす場合、なるべく消費するメモリは少なくしたいと思いました。なので、Awake時にまとめてリソースをとりあえず読み込んでおく実装をやめ、BGMを変更するたびにそれを毎回読み込むことに!(これくらい初めからやっておけよ!)

 この時一つ気になったのは、AudioSourceのclipを変更した時、元のclipはどうなっているのか。


実験1

 まずは下のようなコードで実験。nowPlayBGMは常に今流れているBGMを指しています。



実行初期
f:id:thinline196:20170105003738p:plain



一曲目を再生すると、、
f:id:thinline196:20170105003809p:plain



二曲目を再生
f:id:thinline196:20170105003834p:plain



もう一度1曲目を再生してもメモリは変わらず。なので、上書きしただけでは消えませんね。


実験2

 実は今回再生に使用しているクラスはシングルトンなクラスなのですが、これはモンスターとエンカウントしたらシーンが切り替わる前から戦闘BGMを流し始めたいからです。つまり、一つのBGMは再生されたら次のシーンでもそのまま流れ続けます。では、シーンを遷移させた場合、使われていない方のBGMのリソースは解放されたりはしないのでしょうか?やってみます。


まずこちらが先ほど通り、2曲目を再生させた状態
f:id:thinline196:20170105004419p:plain



で、こちらが2曲目を流したまま別のシーンへ遷移した後の状況(2曲目は流れ続けています)
f:id:thinline196:20170105004727p:plain



使われていないBGMはしっかりリリースされていますね!さすがUnity!



実験3

 無事、使われていないものはリリースされましたが、自分の手で管理するのがやはり一番安全。同じシーン内でもBGMを変更する場面があるかもしれません。なので以下のように書き換えてみました。



まず一曲目を再生した状態
f:id:thinline196:20170105010137p:plain



お次は二曲目を再生した状態
f:id:thinline196:20170105010222p:plain



しっかりリリースされています!今回の場面では、gameObject.Destory()を使用するとエラーが出てしまいましたが、これを使ってリリースする場面もおそらくあると思います。



まとめ

 BGMは一つ一つのデータが大きいから、ボトルネックになりやすいかなと思いとりあえずやって見ました。シーンを跨げば一応解放されますが、自分の手で管理するぶんに越したことはありませんね!
 あと、今までコードをブログに直接貼り付けていましたが、今回からgistを使用させてもらいました。バックグラウンドが黒にならないのが気になって、今まで使用していなかったのですが、やはり色付き具合が前より少しマシで、何よりコードとして見やすいかなと思ったので、これからgistを使用することにしました。


以上お疲れです。