Monodevelop - UnityでVersionControlが消えた時の対処
はじめに
MacOSX 10.11.2
Unity 5.4.2f2
MonoDevelop-Unity 5.9.6
バージョン管理はGit
BlameやDiff、Changesをワンクリックで見れるので重宝してる、こんなやつ
ただこいつはよく消える
消えた時
Monodevelop-Unity > Add-In Managerを開いてこれをenableにする
これで復活
する時もあればしない時もある
しない時はSolutionWindowを開いて(View > Pads > Solutionで開ける)
スクリプトファイルを選択した時に出る歯車アイコンクリック、DiffとかBlameとかLogとか選択すると復活する
それでも復活しなかった時が来たら対処法調べて追記します。
【windows】何も考えずに最速でsshkeyを作ってgithubと連携する
Gitをインストールします
各チェックボックスはこんな感じで
後は全部一番上にして、デフォルトのままでおk
インストール後
デスクトップにできたGitBashのアイコンをダブルクリックでBash開く
sshkeyを作る(下記をそのまま打ち込んでEnter)
ssh-keygen
ここに作りますか?って聞かれる。(ディレクトリ階層が表示されてる)
Enter押す
passphraseは?って聞かれる。何も考えないのでいらない
Enter押す
もういっかい入力してねって言われる。何もいれてないのでいらない
Enter押す
GitHubと連携
sshkeyは初期状態のままならUser/自分のアカウント名/.sshフォルダ内にある
隠しフォルダになってる場合があるので隠しフォルダ見えるようにしとこう
.sshフォルダの中にある、id_rsa.pubをテキストエディタで開くと謎の文字列が生成されているのですべてコピーする
github開いて、右上の自分のアイコンからSettingsを選択するとこんな画面が出る。
その中のSSH and GPG keysを選択
New SSH Keyボタンを押してこんな感じで作成
後はリポジトリクローンするときに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
なんか差分の1GBくらいどっかいったけど、多分履歴をfilterしたりしたから?
バイナリ直で持たなくなったから減るとかあるのかな
うまく使ってBitBucket無料プランで乗り切っていきたい
あとSSH認証じゃないとファイル100件ごとにパスワード要求されるのでKeyは作っておこう
デジゲー博お疲れさまでした&SleepWalkerデモ版配布
どうも、かせです。
本日、デジゲー博にSleepWalkerのデモ版を出展させていただきました。
会場から閉会まで絶え間なくプレイしていただき、デジゲー博の熱量の高さを思い知りました。
また、夏から開発しはじめ、初めて人前でプレイをしていただけたので、様々なフィードバックを得ることができました。
この場を借りて
デジゲー博準備会様
各出展者様
来場者様
に深く感謝の意を述べさせていただきたく思います。
また、ゲームライターコミュニティ様にて記事を書いていただきました。
【デジゲー博2016】SleepWalker – ゲームライターコミュニティ
ありがとうございました。
SleepWalkerについて
夏から開発をしている「オープンワールド3DアクションRPG」です。
世界の体験をコンセプトとして、開発をしています。
また、プレイ感覚としてリアルな感覚を追求するのではなく
より爽快、かつなめらかなアクションを目指しています。
今回のデモは、アクション部分のコンセプトモデルでした。
このデモ版の配布をさせていただきます。
操作方法
「移動」左スティック
「視点移動」右スティック
「会話」Bボタン
「ジャンプ」Aボタン
「飛行」ジャンプ中にAボタンを再度押す、押しっぱなしで持続
「弱攻撃」地上・空中でXボタン
「強攻撃」地上・空中でYボタン
「打ち上げ」地上でRトリガーをおしながらXボタン
「追撃」地上・空中でRトリガーをおしながらYボタン
「回避」Rトリガーボタン
打ち上げ、追撃はすべての行動をキャンセルすることができます。
かっこいいコンボができると気持ちいいです。
動作環境
そこそこのグラフィックスカードがあれば、ラップトップでも30FPSで動作すると思います。
また、ゲームパッドはXInput対応のもののみのサポートになります。
Xbox360コントローラ、XboxOneコントローラの動作は確認済みです。
ご意見などございましたら、気軽にTwitterの方でお声がけください。
今後について
冬コミに当選しました。
1日目・西"ひ"-13a
でSleepWalkerの
オープンワールドになってる(する)
ボス戦とか実装した(する)
体験版を頒布予定です。
少しでも魅力を感じていただけましたら、ぜひご来場くだされば幸いです。
よろしくお願い致します。
最後に
ゲームを面白くするために努力してまいりますので、ぜひSleepWalkerの完成をお楽しみに!
UniRxを紐解く「Take(1)とFirst()の違い」
UniRxとは
大変便利なReactiveExtensionsのUnity版ライブラリ。
最近、業務でも業務外でもこちらを触ることが多く、色々な地雷を踏み倒してきました。
備忘録の意味も兼ねて今回は
- 「Take(1)とFirst()」の違い
をまとめようと思います。
入門者向きではないです、ご了承ください。
あとかなり長いです。
ソースコードなどはこちらの
を参考にさせていただいています。
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の場合はまずクラスの役割を定めましょう。partialで分けるとさらに可読性が低くなります。
2の場合はまず同じメソッドを呼び出していないか、同じ計算を書いていないかを探して最適化しましょう。DRY原則を守れの一言に尽きます。
3の場合。お待たせしました、partialの出番です。
そもそもpartialってなんぞ
これ(投げやり)
クラスの定義を、複数ファイルにまたいで行うことができます。
例として、ある特定のクラス内で使用するStateの中身をpartialで追加していきます。
gist3c692f67badadfc5e98a8f8abd8480a1
こんな感じです。
これだけだと分かりづらいかもしれませんが、このStateを継承したState1やState2というクラスはこのソースに帰属しているということがわかるので、メンテナンス性や拡張性も向上します。
最後
使用方法を間違えると、スパゲッティになりがちなので要注意です。
適切な場所で使いましょう。
おわり