Monodevelop - UnityでVersionControlが消えた時の対処

 

はじめに

 

MacOSX 10.11.2

Unity 5.4.2f2

MonoDevelop-Unity 5.9.6

バージョン管理はGit

 

BlameやDiff、Changesをワンクリックで見れるので重宝してる、こんなやつ

f:id:yutakaseda3216:20170111112414p:plain

 

ただこいつはよく消える

 

消えた時

Monodevelop-Unity > Add-In Managerを開いてこれをenableにする

f:id:yutakaseda3216:20170111112604p:plain

 

これで復活

する時もあればしない時もある

しない時はSolutionWindowを開いて(View > Pads > Solutionで開ける)

スクリプトファイルを選択した時に出る歯車アイコンクリック、DiffとかBlameとかLogとか選択すると復活する

 

それでも復活しなかった時が来たら対処法調べて追記します。

【windows】何も考えずに最速でsshkeyを作ってgithubと連携する

Gitをインストールします

Git - Downloading Package

チェックボックスはこんな感じで

f:id:yutakaseda3216:20170105211036p:plain

f:id:yutakaseda3216:20170105211116p:plain

後は全部一番上にして、デフォルトのままでおk

 

インストール後

デスクトップにできたGitBashのアイコンをダブルクリックでBash開く

sshkeyを作る(下記をそのまま打ち込んでEnter)

ssh-keygen

ここに作りますか?って聞かれる。(ディレクトリ階層が表示されてる)

Enter押す

passphraseは?って聞かれる。何も考えないのでいらない

Enter押す

もういっかい入力してねって言われる。何もいれてないのでいらない

Enter押す

 

GitHubと連携

sshkeyは初期状態のままならUser/自分のアカウント名/.sshフォルダ内にある

隠しフォルダになってる場合があるので隠しフォルダ見えるようにしとこう

.sshフォルダの中にある、id_rsa.pubをテキストエディタで開くと謎の文字列が生成されているのですべてコピーする

 

f:id:yutakaseda3216:20170105212411p:plain

github開いて、右上の自分のアイコンからSettingsを選択するとこんな画面が出る。

その中のSSH and GPG keysを選択

 

New SSH Keyボタンを押してこんな感じで作成

f:id:yutakaseda3216:20170105212610p:plain

後はリポジトリクローンするときにsshでクローンして快適なgitライフを送ろう!

 

終わり

CUI慣れてからSourceTreeとかKrakenとかのGUIに移行しないとgitの内部的な動作ちんぷんかんぷんで終わるので気を付けような(もちろん内部知らなくていいよって人はKrakenをぜひオヌヌヌします)

コミケに参加して&SleepWalkerの今後

 

はじめに

PhantomIslandのブースまで、朝早くに来てくださった方、ご購入していただいた方

大変ありがとうございました。

動画を見ましたと言ってくれる方や、デジゲー博でプレイしていただいていた方など、多くの方に直接販売することができました。

私は、人に直接モノを売るというのが初めての経験でしたので、とてもうれしかったです。

30枚の用意でしたが、午前中早々に完売してしまい、ゲームを目当てにブースに来てくださった方に完売してしまいましたというのが心苦しかったです、数を用意できず申し訳ありません。

しかし海外の方が数名いらしていただいた際に、買えなかったですが今後に期待していますと言われ、とても身が引き締まる思いでした。

ありがとうございました。

 

コミケの活気はすごいですね!デジゲー博の時も思いましたが、素晴らしい場だと思います。

参加できて本当によかったです。

 

頒布したもの

今回頒布した体験版ですが

オープンワールドで自由に探索(本編)

・ボスとの戦闘モード

の二種類のモードをつけさせていただきました。

 

オープンワールドでは、様々な人と話をしたり、依頼をこなしたり、広大な世界を探索できます。

ボスとの戦闘は、一筋縄ではいかないものを用意させていただきました。

ご購入された方はぜひお楽しみください。

 

今後のSleepWalker

 

製品版としては、まだまだ未完成な部分も多く、システムすら乗っていないものもあります。

完成は来年の夏を予定していますが、その前に一度展示をしようと思っています。

BitSummitへの申し込みを予定していますが、予定は未定です。

 

また、今回の体験版で数多くの課題が出ました。

それを一つずつ潰していこうと思っています。

 

また。製品版へ追加するシステムはこのようになっています

・キャラクターの強化システムの作成

・敵キャラクターの追加

・必殺技追加

・攻撃技の追加

・新たに6ワールド追加、7つのダンジョンを作成

・アイテムの追加

・装備品(装飾品)の追加

 

キャラクターを育てる、世界をより仕上げていく、という部分をこれから開発していきます。

ご期待いただければ幸いでございます。

 

最後に

同人でオープンワールドゲームを開発しているということで、国内外で少しだけ注目していただけているようです。

少しプレッシャーもありますが、周りの開発者さんががんばっているところを見て、自分も頑張ろうという気持ちになれています。

ありがとうございます、これからもよろしくお願いいたします。

 

ゲームの完成をお楽しみに!

UnityでGitLFSを使用する際にTrackするべきファイル

 リポジトリが爆発したので背に腹は変えられないとLFSの導入を決意

Trackする画像や素材拡張子

*.png

*.psd

*.tga

*.jpg

*.fbx

*.anim

*.mp3

*.ogg

*.wav

 

git lfs track *.~するより、.gitattributesに直接記述した方が早い

 

追記(2017/03/10)

.animはアニメーション編集しない前提なので、編集する場合は.animを管理対象から外した方が良い

 

結果

導入前:リポジトリ9GB

導入後:リポジトリ1.2GB(!!!!) LFS 6GB

 

なんか差分の1GBくらいどっかいったけど、多分履歴をfilterしたりしたから?

バイナリ直で持たなくなったから減るとかあるのかな

 

うまく使ってBitBucket無料プランで乗り切っていきたい

 

あとSSH認証じゃないとファイル100件ごとにパスワード要求されるのでKeyは作っておこう

デジゲー博お疲れさまでした&SleepWalkerデモ版配布

 

どうも、かせです。

 

本日、デジゲー博にSleepWalkerのデモ版を出展させていただきました。

f:id:yutakaseda3216:20161113205901p:plain

会場から閉会まで絶え間なくプレイしていただき、デジゲー博の熱量の高さを思い知りました。

 

また、夏から開発しはじめ、初めて人前でプレイをしていただけたので、様々なフィードバックを得ることができました。

この場を借りて

デジゲー博準備会様

各出展者様

来場者様

に深く感謝の意を述べさせていただきたく思います。

 

また、ゲームライターコミュニティ様にて記事を書いていただきました。

【デジゲー博2016】SleepWalker – ゲームライターコミュニティ

ありがとうございました。

 

SleepWalkerについて

夏から開発をしている「オープンワールド3DアクションRPG」です。

世界の体験をコンセプトとして、開発をしています。

また、プレイ感覚としてリアルな感覚を追求するのではなく

より爽快、かつなめらかなアクションを目指しています。

 

今回のデモは、アクション部分のコンセプトモデルでした。

 

f:id:yutakaseda3216:20161113210515p:plain

 

f:id:yutakaseda3216:20161113210625p:plain

 

このデモ版の配布をさせていただきます。

 

Dropbox - sleepwalker.zip

 

操作方法

 

「移動」左スティック

「視点移動」右スティック

「会話」Bボタン

「ジャンプ」Aボタン

「飛行」ジャンプ中にAボタンを再度押す、押しっぱなしで持続

「弱攻撃」地上・空中でXボタン

「強攻撃」地上・空中でYボタン

「打ち上げ」地上でRトリガーをおしながらXボタン

「追撃」地上・空中でRトリガーをおしながらYボタン

「回避」Rトリガーボタン

 

打ち上げ、追撃はすべての行動をキャンセルすることができます。

かっこいいコンボができると気持ちいいです。

 

動作環境

 

そこそこのグラフィックスカードがあれば、ラップトップでも30FPSで動作すると思います。

また、ゲームパッドはXInput対応のもののみのサポートになります。

Xbox360コントローラ、XboxOneコントローラの動作は確認済みです。

ご意見などございましたら、気軽にTwitterの方でお声がけください。

twitter.com

 

今後について

冬コミに当選しました。

1日目・西"ひ"-13a

でSleepWalkerの

オープンワールドになってる(する)

ボス戦とか実装した(する)

体験版を頒布予定です。

 

少しでも魅力を感じていただけましたら、ぜひご来場くだされば幸いです。

よろしくお願い致します。

 

最後に

ゲームを面白くするために努力してまいりますので、ぜひSleepWalkerの完成をお楽しみに!

UniRxを紐解く「Take(1)とFirst()の違い」

UniRxとは

大変便利なReactiveExtensionsのUnity版ライブラリ。

neue cc

neuecc (@neuecc) | Twitter

 

最近、業務でも業務外でもこちらを触ることが多く、色々な地雷を踏み倒してきました。

備忘録の意味も兼ねて今回は

  • 「Take(1)とFirst()」の違い

をまとめようと思います。

入門者向きではないです、ご了承ください。

あとかなり長いです。

 

ソースコードなどはこちらの

qiita.com

を参考にさせていただいています。

TakeとかFirstってなんですか?という方は、こちらをまず読まれると良いと思います。

その他にも様々な分かりやすいサンプルがあり、入門に最適です。 

 

 Take(n)

nに指定した分だけ、OnNextを発行するオペレータです。

using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class TakeSample : Base {

    // Use this for initialization
    void Start () {
        gameObject.transform.position = new Vector2(0, 0.5f);

        //Takeで最初の100回以外はカット
        this.UpdateAsObservable()
            .Take(100)
            .Subscribe(l => Move(0.01f, 0));
    }

}

 このソースコード上で書かれたObservableを分解すると

 

  • this.UpdateAsObservable()

毎フレーム、次のオペレータ[Take(100)]に対してOnNextを発行する

  • .Take(100)

OnNextを100回だけ次のオペレータに発行する

  • Subscribe(l => Move(0.01f,0));

OnNextが来たら、Move(0.01f,0)を叩く

 

という記述がされています。

 

ここでさらに、記述されていない中身を付け足したソースコードがこちらです

using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class TakeSample : Base {

    // Use this for initialization
    void Start () {
        gameObject.transform.position = new Vector2(0, 0.5f);

        //Takeで最初の100回以外はカット
        this.UpdateAsObservable()
            .Take(100)
            .Subscribe(l => Move(0.01f, 0),
() => OnCompleted());
} }

 

() => OnCompleted()がSubscribeに追加されています。

これは、Subscribeまでのストリームで、OnCompletedが発行された際に実行されます。

 

そして、今回のObservableでOnCompletedを発行するのは

Take(100)が100回OnNextを通した時です。

 

つまるところ、100回Move()したら、OnCompletedが呼ばれるということです。

 

ちなみに、OnCompletedはだいたいどのオペレータでも

  • try { observer.OnCompleted() }  finally { Dispose(); } ;

という処理になっていますので、OnCompletedを発行してエラーを吐いてもDisposeされるようになっています。

 

まとめ

Take(n)はnに指定した回数だけOnNextを通して、終了時にOnCompletedを発行する

 

First(Func),First()

OnNextが発行された最初の一度だけOnNextを発行します

using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class First : Base
{

    // Use this for initialization
    void Start()
    {
        gameObject.transform.position = new Vector2(0, 1f);

        //クリックされたら右に1.5動かす(但し1回だけ)
        this.UpdateAsObservable()
            .First(l => Input.GetMouseButton(0))
            .Subscribe(l => Move(1.5f, 0));
        //こっちもやってること同じ
this.UpdateAsObservable()
.Where(_ => Input.GetMouseButton(0))
.First()
.Subscribe(l => Move(1.5f, 0));
} }

 このソースコード上で書かれたObservableをまた分解していきます

 

  • this.UpdateAsObservable()

毎フレーム、次のオペレータ[First(Func)]に対してOnNextを発行する

  • .First(Func) .First()

OnNextをFuncがtrueの時に、一度発行する

FuncがないFirst()は、OnNextを無条件で発行する

  • Subscribe(l => Move(0.01f,0));

OnNextが来たら、Move(0.01f,0)を叩く

 

という記述がされています。

 

First()は一度OnNextを発行すると、OnCompletedを発行します

単体では、Take(1)と同じ挙動をします

 

まとめ

First(),First(Func)は一回OnNextを発行し、その後OnCompletedを発行する

 

Take(1)とFirst()の違い

 ここまで読んで

「Take()は回数指定できる、First()は条件指定できるのね、へ〜」

 と思ったことでしょう。

 

それだけではないです、というかここからが重要です

端的に言うと

OnCompletedをオペレータ内で通す際の挙動に明確な違いがあります

 

TakeとFirstのOnCompletedメソッドをごらんください

  • Take
public class Take : OperatorObserverbase<T,T>{

public override void OnCompleted(){
try {observer.OnCompleted();} finally { Dispose(); }
}

}
  • First
public class First : OperatorObserverbase<T,T>{

public override void OnCompleted(){
if(notPublished){
try { observer.OnError(new InvalidOperationException("Sequence is empty"));}
finally { Dispose(); }
}
else{
try {observer.OnCompleted();} finally { Dispose(); }
}
}
}

 

こうなってます、全然違いますね。

 

一目見てなんだこれとなるのは、First()の方にあるnotPublishedというboolだと思います。

これはFirst()でOnNextが発行された時にfalseになるbool値です。

OnNextメソッドでもこれを使用していて、notPublishedの状態の時のみOnNextが次のオペレータに発行されるようになっています。

一度だけしか発行しない処理の中身はこうなっていました。

 

つまり

OnNextが一度も通っていないFirstオペレータはOnCompletedを通しません

こういう明確な差があるわけですね。

 

例として

public class First : Base
{

    // Use this for initialization
    void Start()
    {
        gameObject.transform.position = new Vector2(0, 1f);

        //クリックされたら右に1.5動かす(但し1回だけ)
        this.UpdateAsObservable()
.TakeWhile(_ => isEnabled)
.Where(_ => Input.GetMouseButton(0)) .First() .Subscribe(l => Move(1.5f, 0));
} }

このコードで

一度もGetMouseButton(0)がtrueにならないまま、isEnabledがfalseになり

OnCompletedが発行されると、FirstくんはErrorを吐きます。

 

 

まとめ

OnNextが発行されていなくてもOnCompletedを次のオペレータに通知できるのが

Take(1)

OnNextが発行されていないと、OnCompletedを次のオペレータに通知できないのが

First()

です。

 

もしOnCompletedを発行できるオペレータが複数あるストリームを組むときは

Take(1)を使用することをオヌヌメします。

 

終わり。

間違いなどがあったら@YutaDevelopまでお願いします。

 

unirxすげー

 

C#でpartialを使ってクラスの中身を分割する

 

こんにちは。

 

開発が進んでいくと、一つのクラスの中身が膨大な行数になることがあると思います。

その理由は様々あり、解決策もまた様々あると思います。

 

その中で、今回はpartialを使ってクラスを分割するということを行います。

 

どのような時にpartialを使うのか

まず、クラスの中身が膨大な行数になっていく場面はいつなのかを考えます。

  1. クラスの役割を明確に分けられておらず、なんでもできる神クラスになっている
  2. 役割は明確だが、メソッドなどが抽象化できていないので同じ処理を複数回書いている
  3. 役割も明確で抽象化もできているが、仕様が多い

 

1の場合はまずクラスの役割を定めましょう。partialで分けるとさらに可読性が低くなります。

2の場合はまず同じメソッドを呼び出していないか、同じ計算を書いていないかを探して最適化しましょう。DRY原則を守れの一言に尽きます。

3の場合。お待たせしました、partialの出番です。

 

そもそもpartialってなんぞ

partial (型) (C# リファレンス)

これ(投げやり)

 

クラスの定義を、複数ファイルにまたいで行うことができます。

例として、ある特定のクラス内で使用するStateの中身をpartialで追加していきます。

 

gist3c692f67badadfc5e98a8f8abd8480a1

 

こんな感じです。

これだけだと分かりづらいかもしれませんが、このStateを継承したState1やState2というクラスはこのソースに帰属しているということがわかるので、メンテナンス性や拡張性も向上します。

 

 最後

使用方法を間違えると、スパゲッティになりがちなので要注意です。

適切な場所で使いましょう。

 

おわり