パーティクルの色をスクリプトで変える [Unity]

Unityでパーティクルの色を変える場合、ちょっとてこずったのでポイントをまとめました。

下図の赤線部のように Shader が Particles/Alpha Blended Premultiply になっている場合は下記のコードで色指定できます。

この場合は赤になります。
※コードの gameObject のインスペクタに ParticleSystemコンポーネント が Add されています。

gameObject.GetComponent<ParticleSystem>().startColor = Color.red;

次に、3Dオブジェクトをパーティクルさせる場合は、下図の赤線部のようにShaderを Standard 等に変更することが多いと思いますが、その色をスクリプトで変えるにはマテリアルの色を変更することになる為、下記のコードで色指定できます。

gameObject.GetComponent<Renderer>().material.SetColor("_Color", Color.red);

Shader の種類によっては "_Color" が使えない場合があります。
※詳しくは下記の記事に書かれていました。

 ・マテリアルのプロパティをスクリプトから変更【Unity】

Qubicleで書き出したデータをUnityで大量に配置してみる

最近はサッカーゲームを作っていまして、ゲーム内に配置するオブジェクトは、主にQubicleというボクセル制作ソフトで作ってからUnityに配置しようと考えています。

Qubicleの画面

上記のキャラはテスト用に作った観客のボクセルなのですが、これを出来れば千体くらいスタジアムの観客席に配置できればと考えていまして、どれくらいの負荷がかかるのか調べる為に4パターンの配置方法を試してStatsの内容を比べてみました。

下記はQubicle2.5でのCollada DAE書き出し画面です。(データ書き出しは有料版を購入する必要があるみたいです。)

この設定でDAEファイルを書き出しました。
Optimization設定は「Non-Manifold」が一番ポリゴン数が少ないです。
書き出しは下記の記事を参考にさせていただきました。
 ・【Qubicle】Unityへエクスポートする時の詳細設定

【パターンA】
QubicleでMatrixを1体書き出して、Unityに配置し、12体並べた時と144体並べた時のStatsを出してみる。

【パターンB】
QubicleでMatrixを3体別々書き出して、Unityに配置。
この時のポイントは3体別々に書き出したので、マテリアルも3つ作られているところです。

【パターンC】
QubicleでMatrixを12体まとめて書き出して、Unityに配置。
この場合、1つのマテリアルに12体分まとめられています。
Unityで読み込むとGameObjectが12個分作られていました。(マテリアルは1つ)

【パターンD】
Qubicleで1つのMatrixの中にキャラを12体入れて書き出して、Unityに配置。
この場合も、1つのマテリアルに12体分まとめられ、12体が1つのGameObjectにまとめられます。

まとめ

  12体
Batches
 
Tris
 
Verts   
144体
Batches
 
Tris
 
Verts
A 4 4.3k 10.2k 6 32.8k 67.3k
B 10 4.3k 10.2k 20 32.8k 67.3k
C 4 4.3k 10.2k 6 32.8k 67.3k
D 4 4.3k 10.2k 26 32.8k 67.3k

テストをやる前は「パターンD」が一番軽くなると予想していたのですが、Batchesの回数が多いですね。。何が原因なんでしょう?
結果からすると、QubicleのMatrix1体を大量配置する場合は「パターンA」でもいいけど、複数のMatrixを大量配置する場合は「パターンC」がマテリアルがまとめられる分だけBatchesが少なくて済むようです。

他に良い方法をお知りの方がいましたらコメントいただけると助かります!

スマホ用ゲームアプリ「コロッコトロッコ」をリリースしました



石ころの「コロッコ」が、通勤中に道草ばかりしているのんびり屋の「ノリオ君」を会社へ運ぶ無料のコロコロ物理アクションゲームです。

登場キャラクターはみんなボーっとした表情でちょっとゆるめのゲームとなっております。

是非、スマホでアプリをダウンロードしてお楽しみください!

コロッコトロッコ on App Store  コロッコトロッコ on Google Play



【難しいステージのヒント】
ヒントの記事を追加しました。 (2015/9/15)



【受賞】
当アプリが賞をいただきました!
(カッコ内はこのページに追記した日です)

ニコニコ自作ゲームフェス2016 敢闘賞(アニメーション美術賞) (2016/4/9)



【レビュー記事】
当アプリを以下のサイトでご紹介いただきました。
ありがとうございます!
(カッコ内はこのページに追記した日です)

AppLibrary (2015/8/7)
テクジョ (2015/8/7)
あぷまがどっとねっと (2015/8/7)
GameCast (2015/8/10)
暗黒社 (2015/8/10)
Appliv (2015/8/11)
週刊アスキー (2015/8/13)
アプリゲット (2015/8/18)
AppLink (2015/8/19)
iPhoroid (2015/8/20)
BoomApp (2015/8/21)
Axel Games (2015/8/31)
APPREVIEW (2015/9/1)
アンドロイダー (2015/9/3)
ケータイ Watch: アンドロイダー出張所 (2015/9/10)
もぐらゲームス (2015/9/19)
AndroidView (2015/9/25)
4Gamer.net (2018/1/5)
dメニューゲームナビ (2018/2/16)

iTunes Connect にアプリをアップしたら「バイナリが無効」表記がでる

Unity 4.6 で制作したアプリを iTunes Connect にアップするところでハマってしまったので、メモしておきます。

順を追っていくと、Unity 4.6 でビルドしたXcode用データを使って
Xcode 6.4 の Organizer でVlidate成功。
Xcode 6.4 の Organizer で「Submit to App Store」でアップロード成功。
ところが
iTunes Connect > マイApp > バージョン > ビルドに「+」マークが付かない。
iTunes Connect > マイApp > プレリリース > ビルド を見るとアップロードしたデータのステータス欄に「バイナリが無効」という文言発見。
エラー内容を特定するメッセージさえないので遠い目でブラインド越しに夕日を眺める。
試しに ApplicationLoader 3.0 でアップロードするとまたもやプレリリースで「バイナリが無効」となってしまったのですが、直後Appleからメールが来て、下記のエラー内容が書かれていたので色々調べる。

The app references non-public selectors in ○○○: _activityFunctionImage:, _activityImageForApplication:

Unity のSNSシェアに使う Social Connector が怪しいということで、Social Connector のバージョンを 0.2.9 から 0.3.5 に変更したら解決しました。
※0.2.9じゃないと直接Twitter投稿画面とかを出す PostMessage が使えないのですが、申請できなければどうもこうもないので PostMessage はあきらめました。

Flash・Unity・openFrameworksの計算速度比較

普段使うツールで計算速度が速いのはどれっていうのは、頭の中でなんとなく序列ができていますが、実際の数値でどれくらい差があるんだろうと思い、各ツールに似たような計算をさせて計算時間を計ってみました。

試してみたのは下記のツールです。
 ・openFrameworks(C++)
 ・Unity(C#)
 ・Unity(JavaScript)
 ・Flash(ActionScript3)
 ・Webブラウザ(JavaScript)

実行したコードは後述しますが、主には配列へのアクセスと関数の実行を1億回行ったという内容です。
一番差が出る部分と思う描画関係のコードは一切なく、あくまで配列と関数の速度ですので「へ~」くらいに思いながら参考にしていただければと思います。

実行環境は全て同じPCで統一しています。

[実行環境]
 ・OS: Windows 8.1
 ・プロセッサ: Core i7-4500U

結果は以下のようになりました。

計算時間
(ミリ秒)
ツール 言語 内容
158 openFrameworks C++ v0.8.3 exe
244 Unity C# v4.3.5 PCスタンドアローン
497 Unity JavaScript v4.3.5 PCスタンドアローン
845 Flash ActionScript3 FlashPlayer13.0 スタンドアローン
2096 Webブラウザ JavaScript Chrome v36.0

Unityって、「C#」と「JavaScript」で速度が違ったんですね。初めて知りました。

後、テストしてみて一番驚いたのはWebブラウザでのJavaScript実行の速さです。
ツールごとの順番では一番遅くなっていますが、Webブラウザ用JavaScriptだけは配列の初期設定時にlengthの指定をしていません。
FlashのActionScript3でVectorのlength指定を省略すると計算時間が5000ミリ秒になってしまったこと考えると、Webブラウザ用JavaScriptは思っていたよりかなり早かったです。
かといってWebブラウザ用JavaScriptで配列の初期設定時にlengthの指定をすると8000ミリ秒かかってしまい逆に遅くってしまったので、ケースバイケースということでお願いします。(なにが)

以下、ツール別の内容です。

openFrameworks

ofApp.h

#pragma once
#include "ofMain.h"
#define MAX_NUM 100000000

class ofApp : public ofBaseApp{

	private:
		int time1;
		int time2;
		int arr[MAX_NUM];
		int testFunc(int i);

	public:
		void setup();
		void draw();
		void keyReleased(int key);
};

ofApp.cpp

#include "ofApp.h"

void ofApp::setup(){
	time1 = 0;
	time2 = 0;
}
void ofApp::draw(){
	if(time2 != 0){
		ofDrawBitmapString(ofToString(time2), 20, 20);
	}
}
void ofApp::keyReleased(int key){
	time1 = ofGetElapsedTimeMillis();

	for(int i = 0; i < MAX_NUM; i++) {
		arr[i] = testFunc(i);
		arr[i] = arr[i] + 1;
	}
	time2 =  ofGetElapsedTimeMillis() - time1;

}
int ofApp::testFunc(int i){
	return i;
}
計算時間
(ミリ秒)
ツール ver 言語 内容
158 openFrameworks 0.8.3 C++ exe
162 openFrameworks 0.8.3 C++ Visual Studio Express 2012
ローカルWindowsデバッガー(Releaseモード)
2721 openFrameworks 0.8.3 C++ Visual Studio Express 2012
ローカルWindowsデバッガー(Debugモード)

計算時間は毎回同じ数値が出る訳ではなく、158の場合もあれば260の場合もあったりで結構誤差があるので、ざっくりで見てもらえればと思います。

Unity

C#の場合

using UnityEngine;
using System.Collections;

public class IndexC : MonoBehaviour {
	private int time1 = 0;
	private int time2 = 0;
	private const int maxNum = 100000000;
	private int[] arr = new int[maxNum];

	void Update () {
		if (Input.GetKeyUp(KeyCode.Space)){
			time1 = (int) (Time.realtimeSinceStartup*1000);

			for (int i = 0; i < maxNum; i++){
				arr[i] = testFunc(i);
				arr[i] = arr[i] + 1;
			}
			time2 = (int)(Time.realtimeSinceStartup * 1000) - time1;
		}
	}

	void OnGUI(){
		if (time2 != 0){
			GUI.Label(new Rect(0, 0, 100, 30), time2.ToString());
		}
	}

	int testFunc(int i){
		return i;
	}
}

JavaScriptの場合

#pragma strict

private var time1:int = 0;
private var time2:int = 0;
private var maxNum:int = 100000000;
private var arr:int[] = new int[maxNum];

function Update() {
    if (Input.GetKeyUp(KeyCode.Space)){
		time1 = Time.realtimeSinceStartup*1000;
		for (var i:int = 0; i < maxNum; i++){
			arr[i] = testFunc(i);
			arr[i] = arr[i] + 1;
		}
		time2 = Time.realtimeSinceStartup*1000 - time1;
    }
}

function OnGUI() {
	if (time2 != 0){
		GUI.Label(new Rect(0, 0, 100, 30), time2.ToString());
	}
}

function testFunc(i:int):int {
	return i;
}
計算時間
(ミリ秒)
ツール ver 言語 内容
244 Unity 4.3.5 C# PCスタンドアローン
260 Unity 4.3.5 C# WebPlayer
htmlをFireFox v31.0で再生
497 Unity 4.3.5 JavaScript PCスタンドアローン
531 Unity 4.3.5 JavaScript WebPlayer
htmlをFireFox v31.0で表示
1311 Unity 4.3.5 C# Gameパネル
1468 Unity 4.3.5 JavaScript Gameパネル

Flash

package myproject{
	import flash.display.MovieClip
	import flash.events.MouseEvent;
	import flash.text.TextField;

	public class Index extends MovieClip {
		public var maxNum:int = 100000000;
		public var arr:Vector. = new Vector.(maxNum, true);

		public function Index() {
			stage.addEventListener(MouseEvent.CLICK,clickHandler);
		}

		private function clickHandler(e:MouseEvent):void
		{
			var time1:Number = new Date().time;

			for (var i:int = 0; i < maxNum; i++) {
				arr[i] = testFunc(i);
				arr[i] = arr[i] + 1;
			}
			var time2:Number = new Date().time-time1;
			var tf:TextField = new TextField();
			addChild(tf);
			tf.text = String(time2);
		}

		public function testFunc(i:int):int
		{
			return i;
		}
	}
}
計算時間
(ミリ秒)
ツール ver 言語 内容
845 Flash CC2014 AS3 FlashPlayer13.0 スタンドアローン
1044 AIR 14.0 AS3 AIRランタイム デスクトップ版
4350 Flash CC2014 AS3 FlashPlayer14.0
htmlをFireFox v31.0で表示
4063 Flash CC2014 AS3 プレビュー
5060 AIR 14.0 AS3 FlashDevelop 4.6.2
AIR 14.0 テスト再生
リリースモード
27292 AIR 14.0 AS3 FlashDevelop 4.6.2
AIR 14.0 テスト再生
デバッグモード

FlashDevelopのAIR テスト再生(デバッグモード)の圧倒的な遅さが気になったのですが、原因がよく分かっていません。

Webブラウザ

<html>
<head>
<script language="Javascript" type="text/javascript">
	var maxNum = 100000000;
	var arr = [];

	function clickHandler(){
		var time1 = new Date();
		for (var i = 0; i < maxNum; i++) {
			arr[i] = testFunc(i);
			arr[i] = arr[i] + 1;
		}
		var time2 = new Date()-time1;
		document.getElementById("timePane").innerHTML=time2;
	}
	function testFunc(i){
		return i;
	}
</script>
</head>
<body>
    <a href="javascript:clickHandler();">button</a>
    <div id="timePane"></div>
</body>
</html>
計算時間
(ミリ秒)
ツール 言語 内容
2096 Webブラウザ JavaScript Chrome v36.0
2184 Webブラウザ JavaScript IE v11.0
4576 Webブラウザ JavaScript FireFox v31.0

IEが以外と早いです。

※どのブラウザでもループの回数は1億回で試すとタイムオーバーか何かで処理が止まってしまっていたので、タイムオーバーにならない5千万回で出た計算時間を2倍にしています。

ABOUT

MY APPLI

サッカーピープル
サッカーピープル

操作のしやすさ最優先の
自由自在なサッカーゲームです
iOS版 / Android版

コロッコトロッコ
コロッコトロッコ

石ころのコロッコを転がしながら
サラリーマンを会社へ運ぶゲームです
iPhone版 / Android版

CATEGORIES

ARCHIVES

TAGS

3Dプリント AIR ANE Arduino Away3D client work DIY Flash Funnel JavaScript Kinect LED openFrameworks PhotoShop Progression Qubicle Unity Xcode アプリ インターバル撮影 カメラ キャラ ゲーム制作 コロッコトロッコ スクリーンセーバー デバッグ フットサル ミニマル ランニング レーザーカッター 事務所 低山部 作品 動物 塗装 展示会 文字 料理 福岡てら子 美食家 街ぶらり 道具 鉄道 電子工作

FEEDS

SNS

--

Arduinoをはじめよう
Arduinoをはじめよう

電子工作が未経験の人にも
分かりやすい入門書

Arduinoをはじめようキット
Arduinoをはじめようキット

上の書籍の内容が
一通り試せるツールセット

Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ
Prototyping Lab

「Arduinoをはじめよう」より
深く掘り下げた内容の実践書

Make: Electronics
Make: Electronics

電子工作の基礎から実践まで