git mergeで特定のファイルだけを取り込む
あんまり使う場面はないかもだけど。
git merge --no-commit -Xtheirs {mergeしたいブランチ名} git reset HEAD {mergeしたくないファイル名} git checkout {mergeしたくないファイル名} git commit
-Xtheirsで相手方を優先して取り込む。
参考
Unityプロジェクトで使っている.gitignore
Unityプロジェクト作るときに自分が使っている.gitignoreです。
UnityでAndroidビルドをする方法
概要
UnityでAndroidのバイナリ(apk)を作成する手順の紹介です。
前提
- Unity2018.4.6f1
- Mac
前準備
NDK、SDKのインストール
Androidのil2cppビルドをするためにはNDK、SDKが必要になります。 それぞれインストールします。
Android Studio(SDK)
Android NDK
JDKについては、Android Studioに同梱されているOpenJDKを使用しています。
Android Studioは実際に起動しないと最新のBuild-toolsやSDK Platformはインストールされません。
Toolsに関しては、androidコマンドが存在している25.2以下でないとビルドに失敗する可能性があります。
Preferencesの設定
Unity -> PreferenceからNDK、SDKのパスを設定します。 必要なNDKのバージョンはUnityごとに変わりますがここで確認できます。
余談
ここの設定はマシンで共通になるので、異なるUnityバージョンで必要なNDKが違ってビルドしたい場合は厄介になるかもしれません。
ここにはシンボリックリンクを記載しておいて、ビルド直前にシンボリックリンクと実際のパスを切り替えるくらいしか良い手を思いつきません。
ここまでがビルドの前準備になります。
ビルド
PlayerSettingsの設定
PackageNameやVersionCodeなどAPK作成に必要な設定をを行います。 Idenfication(PackageNameやVersionCodeなど) 一例
Configuration(IL2CPPやアーキテクチャなど) 一例
アイコンやkeystoreの設定もPlayerSettingsで行うことができます。 これらの項目はものによってはGradleプロジェクトで直接設定する方法もあります。アイコンなどは最新のUnityを使っていない場合は、Android側が要求するサイズを追従できず解像度が崩れる場合もあります。
BuildSettingsの設定
Build SystemをGradleにして、Export Projectにチェックを入れます。 チェックを入れることでGradleのプロジェクトをUnityが作ってくれます。 Export Projectのチェックを外すとapkだけが直接できあがります。
Expotボタンを押します。
エクスポートが完了したらgradle projectのrootに移動します。
ls build/ gradle.properties local.properties src/ build.gradle libs/ proguard-unity.txt
gradleビルド
gradleビルドをしていきます。
gradle build ...
gradleがインストールされていない場合はMacの場合はbrewでインストールできます。
brew install gradle
余談
複数人開発でそれぞれのマシンでビルドするような場合はgradlewを用意してGradleのバージョンを統一させる方法もあります。(別途記事にしたいと思っています)
gradleビルドが完了したらapkが作成できていることを確認します。
find ./ -name '*.apk' .//build/outputs/apk/release/app-release.apk .//build/outputs/apk/debug/app-debug.apk
特定のブランチにあるファイルを別のブランチに移す方法
概要
Gitを使った運用でのマニアック小ネタです。 特定のブランチにしかないファイルを別のブランチに移す方法を考えていきます。
方法① コピペする
単純で分かりやすい方法です。 デスクトップなどにファイルを一時的にコピーしておいて、ブランチを移動してコピペすればファイルの移動が完了です。 しかし、ファイルが増えて来た場合、コピペの手間も増えていってしまいます。 何よりスマートな方法とは言い難いと思います。
方法② Revertコミットを利用する
では、Gitを利用した移動方法を考えてみます。 Gitにはrevertコマンドを使ってあるコミットを打ち消すコミットを作ることができます。
例えば、developブランチにしかないtest1.txtをfeature/add_test_fileというブランチに移動させてみたいと思います。
developブランチで作業
rm test1.txt git add test1.txt git commit -m "テストファイルを削除"
これでテストファイルを削除したコミットのハッシュ値が決まるので、revertコマンドを使って打ち消しを行います。
git revert {先ほどのtest1.txtの削除commitのhash値}
打ち消しを行ったので、test1.txtのファイルが復活します。
これでrevertコミットのハッシュ値が決まります。 ここでブランチを移動します。
git checkout feature/add_test_file
移動したら先ほどのrevertコミットをチェリーピックします。
git cherry-pick {revert commit hash}
これで、feature/add_test_fileブランチにtest1.txtを移動させることができました。
まとめ
以上、Gitコマンドを使った小ネタでした!
指定した確率でture/falseを取得する
概要
Unityでゲームを作っている時に指定した確率でtrue/falseを取得するということをやりたかったのでそのメモです。
方法
使われる側
private bool GetRandBool(int rate) { int num = Random.Range(0, 100); if (num < rate) { return true; } return false; }
使う側
// 50%の確率でtrueが返ってくる rate = 50; bool isCatchMonster = GetRandBool(rate);
Gitコマンド集
概要
自分がよく使うgitコマンドを随時追加していく予定。
gitって難しいな。
コマンド
一つ前のコミットメッセージを変更したい
git commit --amend
ブランチ間の差分を見たい(ファイル名のみ表示)
git --name-only master...target/branch
ブランチ間のfile changedの数を知りたい
git --name-only master...target/branch | wc -l
ローカルブランチを削除したい
git branch -d target/branch
ローカルブランチを強制的に削除したい
git branch -D target/branch
リモートブランチを削除したい
git push origin :target/branch
ブランチ間のハッシュとメッセージ差分をみたい
git log --no-merges --oneline master..develop
リモートのブランチを強制的に優先させる
git reset --hard origin/master
ローカルのoriginブランチが残ってしまう
git fetch --prune
gitがなんか重いな(ガベコレ)
git gc
Unityでタップ演出を実装する
概要
こんな感じのタップ演出の実装方法です。
パーティクルの用意
白く光る波紋はパーティクルを使っています。今回はテクスチャなどの用意はしていません。 設定は以下のようにしています。
color over lifetimeも設定します。
左上のアルファは255、右上のアルファを0に設定しています。 続いて、size over lifetimeを設定します。
早い段階で急速に大きくなりそのあとは緩やかに大きくなるようにしています。 最後にLayerの設定をします。
Emmitやshapeは今回は不要なのでチェックが入っている場合は外します。
カメラの用意
今回は、タップエフェクトだけを映す専用のカメラを用意しました。 設定です。
逆にMainCamera側にはタップ演出は映らないように設定します。(2重に見えてしまうので)
CullingMaskからTransparelentFXのチェックを外します。
スクリプトの用意
以下のスクリプトを用意して、一番はじめに呼ばれるシーンにGameObjectを用意しアタッチをしました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EffectController : MonoBehaviour { [SerializeField] ParticleSystem tapEffect; [SerializeField] Camera camera; private static bool isTapEffect = false; void Awake() { if (!isTapEffect) { DontDestroyOnLoad(this.gameObject); DontDestroyOnLoad(tapEffect); DontDestroyOnLoad(camera); isTapEffect = true; } } void Update() { #if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR // iOS and Android if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); if (touch.phase == TouchPhase.Began) { var pos = camera.ScreenToWorldPoint(Input.mousePosition + camera.transform.forward * 20); tapEffect.transform.position = pos; tapEffect.Emit(1); } } #else if(Input.GetMouseButtonDown(0)) { var pos = camera.ScreenToWorldPoint(Input.mousePosition + camera.transform.forward * 20); tapEffect.transform.position = pos; tapEffect.Emit(1); } #endif } }
シーンをまたいで使いたかったのでDontDestroyOnLoadをしています。
以上で実装完了です!