git statusでcopiedとなる操作

概要

git statusでcopiedとなる操作方法を説明します。
f:id:yasuaki-ohama:20170217011910p:plain

操作方法

1, base.txtを作成し、copiedcopied...と適当に文字を入力
f:id:yasuaki-ohama:20170217012205p:plain
2, git add base.txt
3, git commit
4, base.txtを複製し名前をbase_copy.txtにする
f:id:yasuaki-ohama:20170217012526p:plain
5, base.textを開き「a」を追加する
f:id:yasuaki-ohama:20170217012607p:plain
6, git add base.txt
7, git add base_copy.txt
8, git status
f:id:yasuaki-ohama:20170217011910p:plain

まとめ

2つのファイルが同じ(または非常に同じ)場合、gitはそれらをコピーとして認識してしまうことが原因でcopiedという表記になる
copiedになることによってデータ上の違いはないと参考にしたページに記載あり
また、ある程度データがないとcopiedが出ない場合がある。

簡単にコードの時間を計測するクラス

概要

時間を計測する時は以下のようなクラスを利用し、測りたいコードの開始と終了をはさんで表示させます。
より高い精度で時間を計測する: .NET Tips: C#, VB.NET
しかし、毎回処理の開始と終了に記載し表示するコードを書くのは時間がかかります。
そこで簡単にコードの時間を計測するクラスを作成しました。

使い方

  1. 無名関数を入れる
  2. メソッドを直接入れる
using System;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
	void GetMouseButtonDown1()
	{
		System.Threading.Thread.Sleep(2000);
	}
	
	// Update is called once per frame
	void Update () {
		if(Input.GetMouseButtonDown(0)){
			Stopwatch.Elapsed("GetMouseButtonDown0",()=>{
				System.Threading.Thread.Sleep(1000);
			});
		}
		
		if(Input.GetMouseButtonDown(1)){
			Stopwatch.Elapsed(GetMouseButtonDown1);
		}
	}
}

結果

f:id:yasuaki-ohama:20160826002902p:plain

Unity スクリプトやプレハブなどのリソースが使用されているかを自動検索するツール

概要

Unityでオブジェクトが利用されているファイルを自動検索する方法を書いた。
yasuaki-ohama.hatenablog.com
しかし、この方法だと「JumpBoard.prefab」がどこで使われているか知りたい時

$ find . -name JumpBoard.prefab.meta
$ cat ./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.prefab.meta
$ git grep -l f1f94e603ef11234d88f2d5bcf4b23d3

と3回もコマンドを打たなければならないため面倒だ。

そこで今回は以下のシェルスクリプトを実行するだけで簡単に検索できるツールを作成した。

使い方1(検索)

findUsedObject.sh · GitHubをダウンロードしてプロジェクト以下に置く
以下のようにコマンドを打ち実行する。

$ ./findUsedObject.sh JumpBoard.prefab
./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.prefab.meta
Assets/Scenes/Stage/0/0_0.unity
Assets/Scenes/Stage/0/1_0.unity
Assets/Scenes/Stage/0/3_0.unity
Assets/Scenes/Stage/0/6_0.unity
Assets/Scenes/Stage/1/1_1.unity
Assets/Scenes/Stage/1/1_5.unity
Assets/Scenes/Stage/1/1_6.unity
Assets/Scenes/Stage/1/1_7.unity
Assets/Scenes/Stage/2/2_5.unity
Assets/Scenes/Stage/3/3_4.unity
Assets/Scenes/Stage/3/3_7.unity
Assets/Scenes/Stage/4/4_4.unity
Assets/Scenes/Stage/5/5_2.unity
Assets/Scenes/Stage/6/6_3.unity
Assets/Scenes/Stage/7/7_1.unity
Assets/Scenes/Stage/7/7_4.unity
Assets/Scenes/Stage/7/7_7.unity
Assets/Scenes/Stage/8/8_5.unity
Assets/Tutorial/Scenes/0_0_Debug_Object.unity

このオブジェクトが利用されているステージがわかる

使い方2(複数検索)

特定の文字列が入っているオブジェクトを利用しているファイルを全て列挙する

$ ./findUsedObject.sh JumpBoard       
./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.cs.meta
Assets/Object/AddMoveObject/JumpBoard/JumpBoard.prefab
Assets/Object/AddMoveObject/JumpBoard/JumpBoardE.prefab

./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.mat.meta
Assets/Object/AddMoveObject/JumpBoard/JumpBoard.prefab
Assets/Object/AddMoveObject/JumpBoard/JumpBoardE.prefab
Assets/Scenes/Stage/1/1_6.unity

./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.png.meta
Assets/Object/Goal/Game_Clear.mat

./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.prefab.meta
Assets/Scenes/Stage/0/0_0.unity
Assets/Scenes/Stage/0/1_0.unity
Assets/Scenes/Stage/0/3_0.unity
Assets/Scenes/Stage/0/6_0.unity
Assets/Scenes/Stage/1/1_1.unity
Assets/Scenes/Stage/1/1_5.unity
Assets/Scenes/Stage/1/1_6.unity
Assets/Scenes/Stage/1/1_7.unity
Assets/Scenes/Stage/2/2_5.unity
Assets/Scenes/Stage/3/3_4.unity
Assets/Scenes/Stage/3/3_7.unity
Assets/Scenes/Stage/4/4_4.unity
Assets/Scenes/Stage/5/5_2.unity
Assets/Scenes/Stage/6/6_3.unity
Assets/Scenes/Stage/7/7_1.unity
Assets/Scenes/Stage/7/7_4.unity
Assets/Scenes/Stage/7/7_7.unity
Assets/Scenes/Stage/8/8_5.unity
Assets/Tutorial/Scenes/0_0_Debug_Object.unity

./Assets/Object/AddMoveObject/JumpBoard/JumpBoardAnimation.cs.meta
Assets/Object/AddMoveObject/JumpBoard/JumpBoard.prefab
Assets/Object/AddMoveObject/JumpBoard/JumpBoardE.prefab

./Assets/Object/AddMoveObject/JumpBoard/JumpBoardE.prefab.meta
Assets/Scenes/Stage/6/6_7.unity
Assets/Scenes/Stage/7/7_5.unity
Assets/Scenes/Stage/7/7_6.unity
Assets/Scenes/Stage/7/7_7.unity
Assets/Scenes/Stage/8/8_7.unity
Assets/Tutorial/Scenes/0_0_Debug_Object.unity

./Assets/Object/AddMoveObject/JumpBoard.meta

使い方3(複数検索 + 特定の拡張子だけ表示)

$ ./findUsedObject.sh JumpBoard unity 
./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.cs.meta

./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.mat.meta
Assets/Scenes/Stage/1/1_6.unity

./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.png.meta

./Assets/Object/AddMoveObject/JumpBoard/JumpBoard.prefab.meta
Assets/Scenes/Stage/0/0_0.unity
Assets/Scenes/Stage/0/1_0.unity
Assets/Scenes/Stage/0/3_0.unity
Assets/Scenes/Stage/0/6_0.unity
Assets/Scenes/Stage/1/1_1.unity
Assets/Scenes/Stage/1/1_5.unity
Assets/Scenes/Stage/1/1_6.unity
Assets/Scenes/Stage/1/1_7.unity
Assets/Scenes/Stage/2/2_5.unity
Assets/Scenes/Stage/3/3_4.unity
Assets/Scenes/Stage/3/3_7.unity
Assets/Scenes/Stage/4/4_4.unity
Assets/Scenes/Stage/5/5_2.unity
Assets/Scenes/Stage/6/6_3.unity
Assets/Scenes/Stage/7/7_1.unity
Assets/Scenes/Stage/7/7_4.unity
Assets/Scenes/Stage/7/7_7.unity
Assets/Scenes/Stage/8/8_5.unity
Assets/Tutorial/Scenes/0_0_Debug_Object.unity

./Assets/Object/AddMoveObject/JumpBoard/JumpBoardAnimation.cs.meta

./Assets/Object/AddMoveObject/JumpBoard/JumpBoardE.prefab.meta
Assets/Scenes/Stage/6/6_7.unity
Assets/Scenes/Stage/7/7_5.unity
Assets/Scenes/Stage/7/7_6.unity
Assets/Scenes/Stage/7/7_7.unity
Assets/Scenes/Stage/8/8_7.unity
Assets/Tutorial/Scenes/0_0_Debug_Object.unity

./Assets/Object/AddMoveObject/JumpBoard.meta

Unity ショップのUI設計

目次

  • 概要
  • 作成物の説明
  • 仕様の説明
  • 完成品
  • 詳細

概要

前回、delegateを利用することで各スクリプトで呼び出したいメソッドをあらかじめ登録して処理ができることを説明した。
yasuaki-ohama.hatenablog.com

今回は、それを応用し、ショップのUIをdelegateを利用して作成する。

作成物の説明

ActionとUnityEventを利用して以下のようなUIを作成する。

  1. ボタンを押して所持金を加算
  2. アイテムを購入
  3. 現在購入できないアイテムを赤表示にする

f:id:yasuaki-ohama:20160613001646j:plain:w200f:id:yasuaki-ohama:20160613004251j:plain:w200f:id:yasuaki-ohama:20160613004256j:plain:w200

仕様の説明

初期化

①初期化時にアイテムidを利用して必要なボタン数を作成
②マスターデータを利用して画像、名前、価格、説明のテキストをボタンに入れる
③作成されたボタンの参照先を渡す(購入できないボタンを非表示にする処理を渡すため)
delegateの処理に登録するためのメソッドを登録して返す
⑤アイテムボタンの参照先と実行処理を利用して、コインが変更された時に呼び出すように設定する

入力操作

⑥アイテムボタンが押されたらYes/Noウィンドウを開き、idを渡しマスターデータを利用して表示
⑥アイテムパネルが押されたら説明テキストを押したアイテムの説明に変更する
⑦Yesボタンを押したらコインの減算を行う
⑧所持金表示パネルを更新
⑧現在のコインで購入できないボタンを非表示にする
f:id:yasuaki-ohama:20160613001651p:plain

完成品

github.com

詳細

今回はボタンを押した後の処理の設定を「インスペクター」と「コード」の二種類の方法で行った

インスペクター

インスペクターでUnityEventを利用した設定方法はコードを書かずにクリックするだけで簡単に作成することができる。しかし、登録した内容を変更することや渡す引数を変更することは基本的にできないので以下のような場所で利用した。

所持金を1000円増やす処理

f:id:yasuaki-ohama:20160615214351p:plain:w400

ウィンドウを非表示にする処理

f:id:yasuaki-ohama:20160615214906p:plain:w400

コード

新しく追加したオブジェクトに対して設定を行ったり、渡すパラメータを動的に変更したい場所は生成時にコードで直接設定を行った。

CreateShopItem.cs

ボタンをタップした後にYes/Noウィンドウを開いてアイテムデータを渡す処理

button.onClick.AddListener (() => {
    OpenYesNoWindow (key);
});

アイテムのパネルを押した時にアイテムテキストにアイテムの説明を表示する処理

panel.onClick.AddListener (() => {
    ChangeItemText (key);
});

アイテム購入後に購入できないアイテムを赤表示にする処理

onChangeCoin += (coin) => {
    bool canBuy = coin >= ItemMasterData.GetValue (key).prise;
    button.interactable = canBuy;
    panel.interactable = canBuy;
};
CoinManager.cs

所持金が変更された時に表示を変更する

this.onChangeCoin += (coin) => {
    coinText.text = coin.ToString ();
};

アイテムを購入した時に所持金を減らす

yesNoCanvas.transform.FindChild ("YesNoPanel/Yes").GetComponent<Button> ().onClick.AddListener (() => {
    SubCoin (yesNoCanvas.GetComponent<ShowItemData> ().GetPrice);
});

Unityのiosとandroidのbuildをjenkinsで行う/iOS Build

以下の記事の「iOS Build」

目次

  • (sampleプロジェクトで設定済み)アプリを公開する設定
  • jenkinsでボタンひとつでipaファイルを作成する

(sampleプロジェクトで設定済み)アプリを公開する設定

以下のサイトが詳しく説明しているので省略する
iOS App開発:.p12ファイルとProvisioning Profileの作成 - マックブックな日々(Macbook Geek)

jenkinsでボタンひとつでipaファイルを作成する

「新規ジョブ作成」をクリック
f:id:yasuaki-ohama:20160606211344p:plain:w100
「Sample_iOS」という名前を付ける
「フリースタイル・プロジェクトのビルド」をチェックする
OKボタンを押す。
f:id:yasuaki-ohama:20160607052442p:plain

ソースコード管理」のgitにチェックをつけ、以下をコピペする

git@github.com:yasuakiohama/UnityJenkinsSample.git

f:id:yasuaki-ohama:20160606211550p:plain
「ビルド」でUnity3d Editorを選択する
f:id:yasuaki-ohama:20160606211845p:plain:w200
以下のコマンドをコピペする

-quit -batchmode -executeMethod MyBuilder.BuildProjectAllSceneiOS

f:id:yasuaki-ohama:20160607052725p:plain

iOSProvisioningProfile.mobileprovisionとiPhoneDeveloperA.p12をプロジェクトに入れる
iOSProvisioningProfile.mobileprovisionはストアからダウンロード
iPhoneDeveloperA.p12はキーチェインから書き出す
f:id:yasuaki-ohama:20160607053436p:plain:w300

cd /Users/Ohamayasuaki/.jenkins/jobs/Sample_iOS/workspace
mkdir key 
以下のように設定
/Users/Ohamayasuaki/.jenkins/jobs/Sample_iOS/workspace/key/iOSProvisioningProfile.mobileprovision
/Users/Ohamayasuaki/.jenkins/jobs/Sample_iOS/workspace/key/iPhoneDeveloperA.p12

以下のサイトを参考にPackageApplicationファイルを変更する。
Packaging iOS apps from the command line - cutting.io
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication

- my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements,resource-rules",
-   "--sign", $opt{sign},
-   "--resource-rules=$destApp/ResourceRules.plist");
+ my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements",
+   "--sign", $opt{sign});

「ビルド」で「シェルの実行」を選択
f:id:yasuaki-ohama:20160606212050p:plain:w200
以下をコピペする。
gist.github.com

以下の3つを修正

# Mac OSX管理パスワード
OSX_ADMIN_PASSWORD=LoginPasswd

# 証明書ファイルパスワード
IOS_P12_PASSWORD=P12Passwd

# コード署名用 IDENTITY
IDENTITY="iPhone Developer: yasuaki ohama (?????????)"

OKボタン押して完了
「Buildの実行」を押す
以下にipaファイルが生成される

/Users/Ohamayasuaki/.jenkins/jobs/Sample_iOS/workspace/Build/Sample_iOS-2.ipa

注意

MyBuilder.csのUntitledの部分がそのまま

private const string BUNDLE_IDENTIFIER = "com.Company.Untitled";

app作成のファイル名になるので、bundle identifierを変更した場合はjenkinsのシェルも変更すること

TARGET_APP_PATH=$XCODE_PROJECT_PATH/build/Release-iphoneos/Untitled.app

Unityのiosとandroidのbuildをjenkinsで行う/Android Build

以下の記事の「Android Build」

目次

  • (sampleプロジェクトで設定済み)アプリを公開する設定
  • (sampleプロジェクトで設定済み)keystoreのパスワードを自動入力
  • jenkinsでボタンひとつでapkファイルの作成する

(sampleプロジェクトで設定済み)アプリを公開する設定

以下のサイトが詳しく説明しているので省略する
[Unity] Android アプリを公開する為の設定

(sampleプロジェクトで設定済み)keystoreのパスワードを自動入力

https://github.com/yasuakiohama/UnityJenkinsSample/blob/master/Assets/Editor/MyBuilder.cs
以下でkeystoreのパスワードを自動入力している

PlayerSettings.Android.keystorePass = "keystorePass";//キーストアのパスワード
PlayerSettings.Android.keyaliasName = "keyaliasName";//エイリアス名
PlayerSettings.Android.keyaliasPass = "keyaliasPass";//エイリアスパスワード

jenkinsでボタンひとつでapkファイルの作成する

「新規ジョブ作成」をクリック
f:id:yasuaki-ohama:20160606211344p:plain:w100
「Sample_Android」という名前を付ける
「フリースタイル・プロジェクトのビルド」をチェックする
OKボタンを押す。
f:id:yasuaki-ohama:20160606211506p:plain

ソースコード管理」のgitにチェックをつけ、以下をコピペする

git@github.com:yasuakiohama/UnityJenkinsSample.git

f:id:yasuaki-ohama:20160606211550p:plain
「ビルド」でUnity3d Editorを選択する
f:id:yasuaki-ohama:20160606211845p:plain:w200
以下のコマンドをコピペする

-quit -batchmode -executeMethod MyBuilder.BuildProjectAllSceneAndroid

f:id:yasuaki-ohama:20160606211826p:plain

「ビルド」で「シェルの実行」を選択
f:id:yasuaki-ohama:20160606212050p:plain:w200
作成されたapkのファイル名を「Job名-ビルド回数.apk」にする
Workspace/Build/Sample_Android-1.apk以下のディレクトリに置くように設定
OKボタン押して完了

mkdir -p $WORKSPACE/Build
mv Android.apk $WORKSPACE/Build/$JOB_NAME-$BUILD_NUMBER.apk

f:id:yasuaki-ohama:20160606212144p:plain

Buildの実行をクリック
f:id:yasuaki-ohama:20160606213450p:plain

完了すると左下のビルド履歴に青い丸が出る(失敗すると赤)
f:id:yasuaki-ohama:20160606213737p:plain
以下にapkファイルが生成される

/Users/Ohamayasuaki/.jenkins/jobs/Sample_Android/Workspace/Build/Sample_Android-1.apk

注意

bundle identifierを変更する場合は以下のスクリプトを変更すること、
ios, androidによって、またはリリースする国によって変更したい場合などはここに条件をつけると良い
https://github.com/yasuakiohama/UnityJenkinsSample/blob/master/Assets/Editor/MyBuilder.cs

private const string BUNDLE_IDENTIFIER = "com.Company.Untitled";

Unityのiosとandroidのbuildをjenkinsで行う/Jenkins

以下の記事の「Jenkins」

目次

  1. Jenkinsのインストール・設定・起動
  2. Jenkinsのプラグインを入れる
  3. JenkinsのUnity3dBuilder Pluginの設定
  4. URL

Jenkinsのインストール・設定・起動

以下のサイトを参考にし、Jenkinsのインストールと設定を行った
MacにHomebrewをインストールする - Qiita
OS XにJenkinsをHomebrewでセットアップする - Qiita

インストール
brew install jenkins

jenkins起動
java -jar /usr/local/opt/jenkins/libexec/jenkins.war

launchctlで読み込み、起動する場合
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
launchctl stop homebrew.mxcl.jenkins
launchctl start homebrew.mxcl.jenkins

「~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist」の設定例
gist.github.com
同じ設定にすればブラウザに以下のURLを打てばJenkinsにアクセスできる
(外部からのアクセスができないようにhttpListenAddress=localhostを追加している)
http://localhost:8080/

Jenkinsに「Unity3dBuilder Plugin」と「Git plugin」のプラグインを入れる

今回は以下の二つのプラグインを入れる

  • Git plugin
  • Unity3d plugin

以下のサイトを参考に作成した
Unity3dBuilder Pluginを使ってJenkinsでUnityのビルドを自動化。Androidのapkを作ってみた - Qiita

以下のブラウザからjenkinsにアクセスする
http://localhost:8080/
f:id:yasuaki-ohama:20160607030944p:plain

「Jenkinsの管理->プラグインの管理->利用可能」の中から
「Unity3dBuilder Plugin」と「Git plugin」にチェックをつける
f:id:yasuaki-ohama:20160606204707p:plain:w200
f:id:yasuaki-ohama:20160607034457p:plain
f:id:yasuaki-ohama:20160607034740p:plain
f:id:yasuaki-ohama:20160607034741p:plain
「ダウンロードして再起動後にインストール」を選択

JenkinsのUnity3dBuilder Pluginの設定

「Jenkinsの管理->システムの設定->Unity3d」
で、インストールディレクトリを設定を行う(複数設定可能)

名前 Unity5.3.4p4
インストールディレクト /Applications/Unity5.3.4p4/Unity.app

f:id:yasuaki-ohama:20160606204728p:plain
ジョブの設定で以下のように表示される
f:id:yasuaki-ohama:20160607035700p:plain