おれんじりりぃぶろぐ

きっと何者にもなれないエンジニアのブログ

git mergeで特定のファイルだけを取り込む

あんまり使う場面はないかもだけど。

git merge --no-commit -Xtheirs {mergeしたいブランチ名}
git reset HEAD {mergeしたくないファイル名}
git checkout {mergeしたくないファイル名}
git commit

-Xtheirsで相手方を優先して取り込む。

参考

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の設定

スクリーンショット 2019-10-13 0.54.02.png (143.7 kB

Unity -> PreferenceからNDK、SDKのパスを設定します。 必要なNDKのバージョンはUnityごとに変わりますがここで確認できます。

余談
ここの設定はマシンで共通になるので、異なるUnityバージョンで必要なNDKが違ってビルドしたい場合は厄介になるかもしれません。 ここにはシンボリックリンクを記載しておいて、ビルド直前にシンボリックリンクと実際のパスを切り替えるくらいしか良い手を思いつきません。

ここまでがビルドの前準備になります。

ビルド

PlayerSettingsの設定

スクリーンショット 2019-10-13 3.03.27.png (167.4 kB)

PackageNameやVersionCodeなどAPK作成に必要な設定をを行います。 Idenfication(PackageNameやVersionCodeなど) 一例 スクリーンショット 2019-10-13 2.59.41.png (13.5 kB)

Configuration(IL2CPPやアーキテクチャなど) 一例 スクリーンショット 2019-10-13 3.01.50.png (124.4 kB)

アイコンやkeystoreの設定もPlayerSettingsで行うことができます。 これらの項目はものによってはGradleプロジェクトで直接設定する方法もあります。アイコンなどは最新のUnityを使っていない場合は、Android側が要求するサイズを追従できず解像度が崩れる場合もあります。

BuildSettingsの設定

スクリーンショット 2019-10-13 0.12.33.png (165.4 kB)

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でマルチ解像度に対応する

現在、ありとあらゆるスマホタブレットアスペクト比の端末が存在しています。 例えばCanvasサイズ1136x640でUI実装を進めた場合、1280×720の端末では以下のような表示になってしまい、大変残念です。

f:id:orange_lily27:20190930011822p:plain:w250

今回はCanvasScalerを使っての対応を行ってみます。 使い方は簡単で、CanvasにCanvasScalerをアタッチしてmodeをscale with screen sizeにすること、Canvasサイズを設定するだけです。

f:id:orange_lily27:20190930012001p:plain

これでCanvasサイズの端末解像度に合わせた伸縮を自動で行ってくれます。 素晴らしい、簡単。

Unityでタップ演出を実装する

概要

こんな感じのタップ演出の実装方法です。

f:id:orange_lily27:20190930004617g:plain:w450

パーティクルの用意

白く光る波紋はパーティクルを使っています。今回はテクスチャなどの用意はしていません。 設定は以下のようにしています。

f:id:orange_lily27:20190930005306p:plain:w250

color over lifetimeも設定します。

f:id:orange_lily27:20190930005448p:plain:w250

左上のアルファは255、右上のアルファを0に設定しています。 続いて、size over lifetimeを設定します。

f:id:orange_lily27:20190930005729p:plain:w250

早い段階で急速に大きくなりそのあとは緩やかに大きくなるようにしています。 最後にLayerの設定をします。

f:id:orange_lily27:20190930010020p:plain:w200

Emmitやshapeは今回は不要なのでチェックが入っている場合は外します。

カメラの用意

今回は、タップエフェクトだけを映す専用のカメラを用意しました。 設定です。

f:id:orange_lily27:20190930010201p:plain:w300

逆にMainCamera側にはタップ演出は映らないように設定します。(2重に見えてしまうので)

f:id:orange_lily27:20190930010430p:plain:w300

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をしています。

以上で実装完了です!

参考

【Unity】タップした位置にエフェクトを表示する - テラシュールブログ