かずおの開発ブログ(主にRuby)

日々の開発のことを色々書きます。

vimの基本コマンド

モードについて

ノーマルモード(esc) : 他のモードの移動もとになるモード

挿入モード (i)

ビジュアルモード(v)

コマンドモード(:)

ファイルの保存読み込み

:w ファイル名 : 名前をつけてファイルを保存

:q :終了

:q!: 強制終了

:e ファイル名 :他のファイルを開く

移動系(ノーマルモード)

hjkl:左下上右

gj:一行下に移動

gl:一行上に移動

gg: 先頭に戻る

G: お尻にいく

control+f :1画面下に移動

control+b:1画面上に移動

w:単語単位で後ろに移動

b:単語単位で前に移動

^:行頭に移動

$:行末に移動

f→行きたい単語の頭文字:その単語に移動

(とか{の上で% : 対応する括弧に移動

ビジュアルモードについて

v:Viaualモード(文字単位) shift+v:Visual Lineモード(行単位) control+v: Visual Blockモード(矩形単位)

応用

gg+v+G:テキスト全選択

カット、コピー、ペースト

カット x:文字単位 dd:行単位 数字+d:数字分行削除

コピー y:文字単位 yy:行単位 数字+y:数字分行コピー

ペースト p

※中途半端な量やりたい場合はビジュアルモードで選択する必要

検索

/+検索文字列:検索 n:下方向に検索 N:上方向に検索 *:今カーソルのある位置の単語を下方向に検索 '#':今カーソルのある位置の単語を上方向に検索

置換

:%s:置換前文字列/置換後文字列/g(c) : 文字列を置換(cをつけると確認を求める)

undo redo

u: Undo(一個戻る) CTRL+r :Redo(一個進む) .:直前の操作を繰り返し

ウィンドウの分割

:sp:ウィンドウを分割(水平方向) :vs:ウィンドウを分割(縦方向) :close:ウィンドウを閉じる :CTRL+w+w:ウィンドウを移動

タブを使う

:tabnew : 新しいtabを作成 :tabe + ファイル名: タブを作ってファイルを開く :gt : タブ間を移動 :tabclose : タブを閉じる :tabdo :全てのタブに対して実行

便利な機能

=:インデントをそろえる(行単位) CTRL+n: CTRL+v→矩形選択→shift+i→なんか打ってenter:矩形選択してまとめて置換

便利な設定

:set number(no number) :行番号を表示 :syntax on(off) : プログラムを色づけ :set tabstop = num: numにタブ数を設定 :set ignorecase(noignorecase) : 検索時に大文字を小文字を区別する

簡易オブジェクトプール

UnityでGameObjectを生成、削除を行うInstatiateとDestroyメソッドゲーム制作においてよく使うメソッドだと思います。しかし、これらのメソッドは処理が重いので、大量に呼んでしまうとPCでは処理が早いのでうまくいっていても、実機に移すとガクガクとかくついてしまいます。 そこで使われるテクニックがオブジェクトプーリングです。

オブジェクトプーリングとは

Unityにおけるオブジェクトプーリングとは要らなくなったGameObjectをDestroyで削除するのではなく、SetAecive(false)で無効化して保持しておき、Instantiateでオブジェクトを生成する代わりに保持しておいたGameObjectを初期化、有効化して再利用するという方法です。これにより使えるオブジェクトがオブジェクトプールにないときにInstantiateが呼ばれる以外はInstantiateとDestroyが呼ばれることがなくなり処理が格段に軽くなります。 Unityのチュートリアルにもオブジェクトプールに関するものがあります。(http://japan.unity3d.com/developer/document/tutorial/2d-shooting-game/optimization/01.html)ただこれは少しややこしかったので、自身の理解のためにも今回はもう少しシンプルな簡易オブジェクトプールを作成したいと思います。

今回作成するもの

youtu.be

今回作成するのは上の動画のようにMaker(上にあるCube)から玉がどんどん出てきて、床にあたると消えるというシンプルなものをオブジェクトプールを用いて作成してみたいと思います。どんどん生成されているように見えますが、よく見るとBallの有効、無効が切り替わってプールされたオブジェクトが再利用されているのが分かるかと思います。

オブジェクトプールが導入前の状態

オブジェクトプールを作成する前に、まずオブジェクトプール導入前の状態を作ってみます。写真のようにヒエラルキー上にMakerオブジェクト、Floorオブジェクトを作成して、MakerオブジェクトにMaker.cs(InspectorでBallに玉のprefabをアタッチ、paceは0.3), 床オブジェクトにFloor.csオブジェクトをアタッチします。(Colliderのアタッチ、materialの作成など別途必要ですが割愛します) f:id:kazuooooo:20150517151811p:plain

gist.github.com

gist.github.com

スクリプトを見るとよくわかりますがこの状態だとMaker.cs側でInstantiateメソッド、Floor.cs側でDestroyメソッドをガンガン呼んでしまっていることわかるかと思います。このままだとかなり処理的に重くなってしまうので、ここにオブジェクトプールを導入していきます。

オブジェクトプールを作成

ではオブジェクトプールを導入していきましょう。 まずObjectPoolという名前で空のゲームオブジェクトを作成しましょう。そこに以下のObjectPool.csをアタッチします。Inspector上でBallPrefabには玉のprefabを、Makerにはヒエラルキー上のMakerを設定してください。

gist.github.com

ポイントはgetBallとreleaseBallメソッドです。これらのメソッドがそれぞれInstatiate, Destroyの代わりをします。 まずgetBallメソッドですが、ここでは a. オブジェクトプールに使えるものがあれば再利用する。 b. なければ生成してプールに追加する という処理を行っています。これによりプールに使える玉(非アクティブ)があるときはそれが初期化されてアクティブにされ、さも新たに生成したように見えます。 続いてreleaseBallメソッドですが、これは単純でオブジェクトをDestroyするのではなく、SetActive(false)で非アクティブにすることでプールに保持しておきます。

Makerスクリプト、Floorスクリプトを書き換え

ObjectPoolの準備が出来たら、仕上げにMakerスクリプトとFloorスクリプトを以下のように書き換えます。

gist.github.com

gist.github.com

これでInstantiateの代わりにgetBall、Destroyの代わりにreleaseBallが呼ばれるようになりました。

確認

最後に再生して確認してみましょう!動画のようballのアクティブが非アクティブが切り替わってどんどんボールが出て行く様子が分かるかと思います。ballの番号が上がっていかないことからオブジェクトがプールされて再利用されていることが分かります。 簡単ですが、概念を理解するのにはいいかと思います!お試しあれ!

activeInHierarchyについて activeSelf と activeInHierarchy についての解説 - 強火で進め

構造体、ゲッターセッター

今までさけて通ってきたところについてのメモ

構造体

構造体はstruct型で書いて中に色々な型の変数を入れておいて保持出来る。(変数を一つにまとめるのに使える) クラスとの違いについてはここが分かりやすい。 クラス -構造体-

getter setter

これ何のために使うのかなと思っていたがgetする値を処理したいときや、setする値を制限したいときに使う模様。何もしたくないときにわざわざ{get; set;}と書くのは他と書き方をあわせるためと思われます。

C# のget set がよくわかりません。。なんのために必要なのでしょうか?... - Yahoo!知恵袋

gist.github.com

追記 上はあんまりよくわかってなかった 変数自体はprivateにしてプロパティ経由でしかアクセス出来ないようにする。プロパティはメソッドだがクラス外部からはクラス変数のようにクラス名.プロパティ名でアクセスが可能 gist.github.com

リモートブランチを強制Pull

gitでなんかよくわからないがPull出来なくなってしまって、一旦リモートブランチ同じ状態に戻したいというときは以下のコマンドでうまくいきます!

git fetch origin

git reset --hard origin/master

git pull ブランチ名

文字列の処理

C#の文字列処理をいちいち調べるのが面倒なのでこちらに随時まとめておきます。

文字列の切り取り

Substring(開始文字位置、切り取る文字数)で使用します。

開始文字位置は配列と同じで1文字目が0になるので注意が必要です。

gist.github.com

 

文字列の置換

Replace(置換前の文字列、置換後の文字列)で使用します。

gist.github.com

 

改行

\n(\の打ち方はoption+¥)で改行できます。

gist.github.com

 

参考

http://dobon.net/vb/dotnet/string/substring.html

[Unity] AnimationEventを用いてAnimationの終了を取得

UnityのAnimationを触っているとAnimationが終わったときに何かしたいみたいなことがよくあると思います。今回はAnimationEventを用いて、Animationの終わりを取得する方法をご紹介します。

完成形

今回サンプルとして作成したのはこちらです。

 

youtu.be

球体が道の上を走るアニメーションが動いており、アニメーションが終了した瞬間に右にあるテキストがAnimationからEndに変わるといったシンプルなサンプルです。

1.プロジェクトを作成

まずはプロジェクトを作成してCanvas配下にText(Textコンポーネント)、Road(Imageコンポーネント)、Circle(Imageコンポーネント)を配置してこんな感じにしてください。

f:id:kazuooooo:20150510201810p:plain

2.アニメーションを作成

続いてAnimationを作成してください。Canvasを選択状態でWindow→Animationでアニメーションウィンドウを起動して録画を使って完成形にあったアニメーションを作成してください。(アニメーションの詳しい作成方法についてはこちらを参照ください

ゲーム開発初心者のためのUnity入門(4):Unityで3Dアニメーションを作成・再生するための基本 (1/3) - @IT)

f:id:kazuooooo:20150510202450p:plain

3. アニメーション終了時に呼び出すメソッドを作成

続いてアニメーション終了時に呼び出すスクリプトを作成します。ここで注意点としてスクリプトをアタッチするオブジェクトは先ほどAnimationを作成したCanvasオブジェクトにしてください。(でないとAnimationEventを呼べません)

f:id:kazuooooo:20150510202801p:plain

TextChange.csの内容はこちらです

gist.github.com

 

4. AnimationEventを追加

下準備が出来たのでここからが本題です。先ほどのCanvasのAnimationウィンドウを再度開きアニメーション終了時のKeyFrame上あたりで右クリックしてください

そうするとAdd AnimationEventという項目が出てくるのでそれを選択します。

f:id:kazuooooo:20150510203451p:plain

すると新しいウィンドウが開いてFunctionが選択出来るようになります。この中から先ほど作成したshowendtextメソッドを選択します。(一覧に表示されない場合はスクリプトがついているゲームオブジェクトとAnimationがついているゲームオブジェクトが同じであるか確認してください。)

f:id:kazuooooo:20150510203648p:plain

ではこれで一度ゲームを再生してみましょう。(Animationではなくゲーム自体の再生です。)

Animationが終了(Circleが一番下にきた)時にテキストにEndと表示されれば成功です。

ただ気づかれたと思いますが一度テキストがEndになるとずっとEndのままです。

そこで動画と同じようにするためには Animationの開始時にもう1つAnimationEventを追加してここでshowAnimationTextを呼んでテキストをAnimationに戻しています。(開始から少しずらしているのは開始直後だと間が短すぎてEndが見えないため)

f:id:kazuooooo:20150510204343p:plain

ここまでやると完成形と同じになるはずです!

お試しあれ!