特定のコミットのブランチを作成
git checkout {コミットハッシュ値} -b {ブランチ名}
例)
git checkout 00abe35 -b tmp/20190421
git checkout {コミットハッシュ値} -b {ブランチ名}
例)
git checkout 00abe35 -b tmp/20190421
パラメータとは、引数のことです。
C#の引数には in
, out
, ref
というパラメータ修飾子をつけることができます。
今回の記事は、パラメータ修飾子それぞれの機能ついて
C#では、値(プリミティブ)型でも参照型でも「値渡し」になります。
詳しくはこちら↓
ref
をつけると参照渡しになる。
private void Test() { int a = 0; Poyo(ref a); Debug.Log(a); //出力結果は1になる } private void Poyo(ref int a){ a = 1; }
out
をつけると、呼ばれた側のメソッドで代入しなければいけない=代入されることが保証される。
もちろん、値渡しにするとそれが実現できないので、参照渡しになる。
private void Test(){ int a; //初期化する必要なし Poyo(out a); //outはつけないとだめ。 } private void Poyo(out int a){ a = 1; //代入する必要がある }
渡すときにout
つけるので、渡す側のメソッドでは変数に値が代入されることが呼ばれる側のメソッドの定義を見なくても一目でわかる。
out
パラメータはint.TryParse()
のように渡したパラメータに結果を詰める、
みたいなメソッドでよく使われる。
int result; //初期化の必要はない int.TryParse(input, out result); Debug.Log(result);
渡したList型に値を詰めるメソッドとかはよくあると思うので、そういう時もout
パラメータが有効。
List result;
Poyo(out result);
c# 7.0 からは以下のように省略する書き方もできるようになった。
int.TryParse(input, out int result); //省略した書き方 Debug.Log(result);
in
パラメータはC#7で追加された。
読み取り専用の引数になります。
読み取り専用なので、inパラメータがついたメソッドを呼ぶ前に必ず値を代入しておく必要があります。
int a; Val(a); //aの値が代入されてないのでコンパイルエラー int b = 1; Val(b); //OK Val(100); //直に定数渡すのもOK
呼ばれるメソッド側では引数に値を代入することはできなります。
これによって勝手に書き換えられるようなことがなくなることが保証される。
private void Val(in int b) { b = b++; //コンパイルエラー }
private void Ref(in List<Hoge> list) { list = new List<Hoge>(); //コンパイルエラー list.Add(new Hoge()); //これは問題なし }
参照型の場合は、参照型の変数の値=実体の参照を変えることができない、
つまり新しい参照を代入する=newすることはできません。
これによって、今までref
で書くことができていた以下のような処理を防ぐことができる。
以下のソースはref
で渡された参照型変数にnewすることが呼び出されたメソッド側でできてしまい、
呼び出し側のメソッドが知らないうちに参照が書き換えることができる状態だった。
in
を使えばnewされることがないのでこれを防ぐことができる。
private void Ref(ref List<Hoge> list) { list = new List<Hoge>(); }
inパラメータがもっている参照が示す参照先のオブジェクトを操ることはできるので、
unityでC#7を使うには、
Edit > ProjectSettings > Player > Scripting Runtime Version
を.NET 4.x Equivalent
にすることで使えるようになる。
・「参照型渡すときにref
パラメータ修飾子つける意味あんの?」
・「参照型でも値(プリミティブ)型でも値渡し」→「??」
C#のパラメータ修飾子について学んでいるときに、
上記の疑問がわいたので調べた内容をまとめた記事です。
void Test() { List<Hoge> a = new List<Hoge>(); Val(a); Debug.Log("count = " + a.Count); } private void Val(List<Hoge> b) { b.Add(new Hoge()); }
▼実行結果
count = 1
上記のソースで「countが増えてる=参照渡しだ」と判断していたのですが、
参照渡しではなく値渡しです。
上記のソースでは、
・参照型変数a
はListの参照先を保持した変数です。
・参照型変数a
を値渡しします。
値渡しをするということは、参照型変数a
の値=Listの参照 をコピーします。
コピーされた変数が参照型変数b
です。
・Val()
の中で、参照型変数b
の値=Listの参照 を元にListにAddします。Listのカウント数は1になりました。
・Test()
の中で、参照型変数a
の値=Listの参照 を元にListのカウント数をデバッグ出力します。
ということが行われています。
参照型変数a
もb
が持つ参照の参照先のListは同じなのですが、それぞれで参照をもっているということです。
以下のようなイメージです。
一方、ref
を用いて「参照渡し」した場合は、
同じ参照を参照型変数a
もb
も持つことになります。
以下のようなイメージです。
先程のソースでは実行結果が同じだったので、実行結果が異なる例を挙げます。
void Test() { List<Hoge> a = new List<Hoge>(); Ref(ref a); //Val(a); RefかValのどちらか呼ぶ Debug.Log("count = " + a.Count); } private void Val(List<Hoge> b) { b = new List<Hoge>(); b.Add(new Hoge()); } private void Ref(ref List<Hoge> b) { b = new List<Hoge>(); b.Add(new Hoge()); }
▼Ref()
(参照渡し)を呼んだときの実行結果
count = 1
▼Val()
(値渡し)を呼んだときの実行結果
count = 0
このように結果が異なります。
先程、値渡しをした場合はコピーされ、
変数a
,b
それぞれで参照をもっていると書きました。
‘Val()‘ の中で変数b
が持っている参照の参照先が新しくnewされたListに変わります。
変数a
の参照先は変わりません。
Test()
では変数a
の参照先をデバッグ出力しているので、カウント数は0のままになります。
以下のようなイメージです。
次に参照渡しの場合です。
参照渡しの場合は変数a
とb
がもっている参照は同一です。
‘Val()‘ の中で変数b
が持っている参照の参照先が新しくnewされたListに変わります。
変数a
と変数b
が持っている参照は同一なので、変数a
の参照先も新しくnewされたListに変わります。
以下のようなイメージです。
このように、参照型の値渡しと参照渡しとでは動きが異なります。
最初に疑問に思ったことの回答・・・
「参照型渡すときにref
パラメータ修飾子つける意味あんの?」
→ある。無駄なコピーはなくせるのでref
はつけた方がいい。
だけど無駄なコピーなくすってメリットぐらいしか思いつかん。。(※)
ほかにメリットある??
(※)今回例であげたような、
呼び出し先のメソッドでnew されるのが前提のソースの場合は、
呼び出し元でnewせずパラメータ修飾子もref
じゃなくてout
でもらうべきだと思うからです。
参考にさせてもらいました、あざしたー★!
using DG.Tweening;
(RectTransform)(gameObject.transform).DOLocalMove(new Vector3(8, 0, 0), 0.5f); //8,0,0の位置に移動
DOMove
はワールド座標での移動。DOLocalMove
はローカル座標。
(a,b,c)に移動したい、という場合ではなく、今いる位置から(d,e,f)移動したいという場合は、.SetRelative
をつけてあげれば良い。
(RectTransform)(gameObject.transform).DOLocalMove(new Vector3(8, 0, 0), 0.5f).SetRelative(); //今いる場所から右へ8移動
Sequence seq = DOTween.Sequence(); seq.Play();
Sequence seq = DOTween.Sequence(); seq.SetLoops(-1); //-1なら無限ループ seq.Play();
Sequence seq = DOTween.Sequence(); seq.Append(((RectTransform)scrollArrowDown.transform).DOLocalMoveY(10, 0.5f).SetRelative()); seq.Append(((RectTransform)scrollArrowDown.transform).DOLocalMoveY(-10, 0.5f).SetRelative()) seq.Play();
シーケンス中にxx秒待つ
Sequence seq = DOTween.Sequence();
sequence.AppendInterval(0.3f);
seq.Play();
CallBackを設定
Sequence seq = DOTween.Sequence(); sequence.AppendCallback (()=>{ if(onFinish != null){ onFinish(); } }); seq.Play();
Image.DOFade
CrossFadeAlpha は unityの仕組みでdotweenじゃないけどおなじようなことできる
今行っているアニメを消す。 component は uGUIの親のComponent。
component.DOKill()
↓の例だと、スケールで小さくしてからゲームオブジェクトをDestroyするみたいな感じ
transform.DOScale(0, this.effectTime).onComplete = () => { Destroy(gameObject); };
SetDelay
を使うことで、xx秒後にtweenの処理をさせることができる。
↓の例は、0.5秒後に0.6秒かけてサイズを200x200にする。シーケンス作るまでもない動きならこっちの方がいい。
rectTransform.DOSizeDelta(new Vector2(200, 200), 0.6f, true).SetDelay(0.5f)
以下は、CanvasGroupのalpha の値を0.5f秒かけて、0にする例
CanvasGroup canvasGroup = effect.gameObject.AddComponent<CanvasGroup>(); DOTween.To(() => canvasGroup.alpha, (n) => canvasGroup.alpha = n, 0, 0.5f).onComplete = () => { Destroy(effect.gameObject); };
Vector3 targetPos = targetObj.transform.position; // transform.DOLookAt(targetPos, 0.25f);
▲白と黒のキャラが、赤いキャラの方向を向きます
複数ブランチで開発していると、別ブランチのファイルを取り込みたいときがある
※ merge
じゃなくて、そのまま上書きたい場合です
取り込み先(ファイルをもらう側)のブランチに切り替えた状態で、
git checkout <取り込み元ブランチ名> -- <取り込みたいファイル名>
取り込み元ファイルがあるブランチとファイル名を指定すると取り込める
リモートのブランチの一覧は-a
オプションをつけることで表示される。
git branch -a
これで表示されない場合は、リモートの情報を取得していないのでfetch
をする
git fetch
意図したリモートブランチが表示されたら、
checkout
してローカルに新しいブランチを作成する
git checkout -b test_branch origin/test_branch
-b
しておくと新しくできたブランチに切り替えまで行ってくれる
複数人で開発している場合、他の人が行ったコミットを自分の開発ブランチにも取り込みたい。
#master
ブランチを例に書きますが、どのブランチでも同じ。
1) ローカルのmasterブランチにリモートのoriginにコミットされた最新を取り込む
2) 開発ブランチにmasterブランチをマージする
git checkout master git pull origin master git checkout dev git merge origin master
ローカルの master
ブランチに移動(checkout)して、
pull(fetch->merge) でリモートのmaster
ブランチに最新情報を取得(fetch)し、ローカルのmaster
にマージする
その後、ローカルの開発ブランチにに移動して、
master
ブランチと開発ブランチをマージする