Flashのシンボル変換時のルーチン作業をサポートするコマンド

最近はUnityを使う時間も多くなりましたが、なんだかんだで一番使う時間が多い開発ツールはFlashという状況です。

1年程前に作ったFlash IDEのコマンドが何気に便利で、もうコレなしじゃ無理!っていうくらい使いこんでいるので紹介してみようと思います。

どういうコマンドかというと、下記画像のようにシンボル「top」内にあるシンボル「top_head」、さらにその中にある「top_head_base」というようなシンボルの階層に沿ってシンボル名を付けていく作業、つまり「親シンボル名_○○」という名前を付ける作業をサポートするコマンドとなっています。

【使い方】
下記画像はシンボル「top_head」の編集画面です。
この画面でシンボルに変換したいオブジェクトを選択します。

ここからシンボルに変換するには普段なら「F8」キーを押して「シンボルに変換」を実行するところですが、今回は代わりに紹介するコマンドを実行します。
『シンボルに変換_「親シンボル名_○○」』という名前のコマンドです。
(キーボードショートカットも登録しておくと便利です。)

シンボル名を記入するダイアログが出るので、今回は「base」と記入してOKを押します。

次にシンボルの基準点を決めるダイアログが出ます。

7:左上 8:中上 9:右上
4:左中 5:中中 6:右中
1:左下 2:中下 3:右下

と表示される予定だったのが、収まり切れずに省略されています(笑)
実際は1~9まで対応しています。
テンキーの位置で見ると分かりやすいです。

数字を記入後、OKを押します。

すると下記のようにシンボル「top_head_base」が出来ました。(赤線箇所)
親シンボルがフォルダに入っている場合でも親と同じフォルダ内に作成されます。
ついでにインスタンス名にも今回命名した「base」が設定されています。(青線箇所)
便利ですね~。もう手放せないですね~。

コマンド(jsfl)のダウンロードは以下からお願いします。

シンボルに変換_「親シンボル名_○○」.jsfl

※動作確認はWindowsでのみ行っています。
※jsflの設置方法が分からない方は「flash jsfl」等で検索してみてください。

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



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

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

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

コロッコトロッコ 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)

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

Unityの2D物理エンジンでミニ四駆っぽいものを動かす

ここ最近、Unityを練習でいじっております。

今回はミニ四駆の構造をモデルにして、ギヤを噛み合わせてモーター側から回転を伝え、タイヤを回すことで車(下記画像)を動かす仕組みをテストしてみました。

実際にミニ四駆のギヤと同じ歯数のギヤ画像を用意して、Unityで組み立ててみます。

ギヤの歯数の組み合わせは、僕が小学生の頃よく遊んでいたミニ四駆シリーズタイプ1の作りに習って、パワーギヤとスピードギヤの2パターンを作成しました。

最初の段階で、ギヤの3Dモデルを用意してMesh Colliderを使って3D物理演算でテストしてみたのですが、形状が複雑すぎるのか、僕の経験不足なのかで思うように動いてくれなかった(ギヤが途中で空回りしだした)ので、今回はPolygon Collider 2Dを使って2D物理演算で行うことにしました。

2Dならうまくギヤが噛み合ってくれるようです。

物理演算は2Dでやっていますが、表示上の配置はZ軸も使っております。

2D物理演算はZ軸が使えないので、そのままだとギヤやタイヤの位置がかぶってうまく衝突判定できないのですが、レイヤーを分けることで特定のレイヤー関係だけを衝突判定させることができるようになりました。

フロントのタイヤを回すにはミニ四駆ではクラウン型のギヤを使いますが、2Dではちょっと厳しいので今回はリアタイヤだけを回すようにしています。

作ってみたのはこちらです。
 ・ミニ四駆デモ1

キー操作でギヤが切り替わります。(切り替わらない場合はデモの再生画面を一度クリックしてみてください)
1:パワーギヤ
2:スピードギヤ

スピードギヤの方が速いようです。上り坂もスピードギヤの方が若干速く登っている、、ということはスピードギヤの方がパワーも出ているということですね。

パワーの関係について調べる為に、ギヤの仕組みを少し単純にしてみたものが下記のデモ2です。
 ・ミニ四駆デモ2

こちらもキー操作でギヤが切り替わります。
1:ギヤ比 約3.2:1
2:ギヤ比 約1:1

茶色のギヤの回転が動力源です。

現実の世界だと「ギヤ比3.2:1」の方がパワーが出るのですが、今回の「デモ2」ではスピードが速い「ギヤ比1:1」の方がパワーも出ています。
てこの力までは計算していないのかな?

これを現実の世界に近い挙動にするには、スクリプトで速度制限などして微調整する必要がありそうですね。

以上、Unityの練習でした。Unity面白い!

1 2 3 4 5 6 7 8 ... 11

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

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