三日坊主のエンジニアBlog

Androidアプリ,Webアプリなどをやってるプログラマの雑記帳

Unity のiOS, Android環境が個人・小規模開発者向け完全無料

Unityで嬉しいニュースがありましたので紹介します。

Unity, iOS と Android を含む個人・小規模開発者向けの
モバイル向け機能を完全無償化

Unity - Unity PRESS RELEASE – Unity, iOS と Android を含む個人・小規模開発者向けの モバイル向け機能を完全無償化

今までは、Unity無料版を利用している場合も、AndroidやiOS向けにビルドするためには各プラットフォームに対して有料のライセンスが必要でしたが、今回、それが無料でビルド可能なりました。

Unityのサイトからダウンロードできる無料フルバージョンの最新版では、すでにデフォルトでAndroid、iOS向けにビルドできる様になっています。
f:id:Synd:20130523213623p:plain

なお、Android向けのビルドではAndroid SDKが必要です。iOS向けのビルドは、Mac OS上でのみ可能です。

Unityを使ってみた

Unity Technologies社が提供しているクロスプラットフォームゲームエンジンであるUnityを最近はじめました。
有料のUnity Proから機能限定版のUnityライセンスが、条件を満たせば無料で使うことができて、利用する人が急増しているそうです。

Unity
http://japan.unity3d.com/

詳しいライセンスやどんなことができるのかは、Unityの公式サイトで確認してください。
私はまだ無料版しか触っていないのですが、実際に使ってみての雑感など羅列してみようと思います。

f:id:Synd:20130404232234p:plain

はじめてUnityを使うには?

初めて触る人は、Unityのチュートリアルなどを見ながら遊んでみるとよいかと思います。スクリプトのAPIや用語などは公式のリファレンスに載っています。
http://japan.unity3d.com/developer/document/
日本語の参考書も最近充実してきていますし、参考サイトも探せば結構増えてきているので、基本的なことはGoogle等で検索すればわりと欲しい情報が見つけられると思います。

プログラミングに関して

ゲームのロジックなどはプログラムを書いて制御することができます。C#, JavaScript, Booが利用可能です。

  • Boo ・・・ 使っていないので不明(Booistさんゴメンナサイ)。
  • JavaScript …しばしばJavaScriptと紹介されているが、実際は文法を拡張した「UnityScript」。変数の型宣言やクラス、プロパティ、を定義することができるなど、使いまくるとJavaScriptに見えないソースコードが出来上がります(恐らくMonoVMで動作するのに効率的なのだろう)。
  • C# ・・・ 個人的にC#が使いやすいと思いました。主に開発環境的な問題が理由なんですが、ソースコードの自動補完(インテリセンス)、リファクタリング等のツールが良く使えるのが大きかったです。私みたいに普段の開発でIDEにどっぷりな人はC#が良いのではないでしょうか。

ちなみに、Unityには、MonoDevelopを改造したエディタが付属していますが、多分多くの人が使い慣れているVisual Studio(ExpressもOK)と連携させて開発することもできます。

無料の範囲内でできることは?

無料版では、Windows,Mac,Linux各プラットフォームの実行ファイル形式やブラウザで実行できる形式に出力できます。Android,iOS,各コンシューマゲーム機用の実行ファイルを出力する場合はそれぞれのライセンスを購入する必要があります。
また、いずれの場合もゲーム起動時にUnityのロゴが必ず入ります。

開発に関連するところでは、Pro版専用の機能として、メモリ量などを確認できるプロファイラの利用や、Occlusion Culling、Static Batching、など、主にパフォーマンスを向上させるための機能や設定、シーンの非同期読み込み等が挙げられます。
APIに関しては、OpenGLの低レベルなラッパーを呼び出し、テクスチャにレンダリング結果を描画するなど、やや凝ったことをするときなど、Pro版が必要になってきます。しかし、最初に作る様なとこは無料でできるので、制限にイライラしないで開発を進められると思います。

どんなゲームが作れる?

基本的にどんなゲームでも大丈夫です。
FPSやTPS等、地形の上を移動するようなキャラクタの操作はUnityの得意分野でしょう。
物理エンジンを駆使する様なゲームも(リアルな物理シュミレーションというより、あくまでゲーム的な利用として)相性がいいと思います。奥行き方向の移動、回転を制御することで2Dの物理系ゲームも可能です。もちろんアクション系やアドベンチャー系以外のジャンルでも使えます。

Unityを使うと何がうれしいの?

Unityで開発して最初に感じたことは、普通に開発していてもソースコードが長くなりにくいことです。オブジェクトのレイアウト、テクスチャやマテリアルとの紐付け、パラメータの初期値の設定など、ソースコードで書くと冗長だったり直感的ではない部分はUnityデザイナに任せてしまえるので、スクリプトは、ゲームロジックの記述に専念できるのだと感じました。
ゲームのデバッグ中に、シーンビューで全体を見渡したり、オブジェクトの座標やパラメータをリアルタイムに変更したりできるのは開発が驚異的に捗ります。
その他にもUnityを使うメリットは数え切れないほどあります。
これを使いこなせれば、楽しいゲームプログラミングLifeが送れるのではないかと思います。

気が向いたらUnityの記事をちょくちょく投稿するかも(^_^)/~~

Blender Python の基本

前回に引き続き、Blener Pythonプログラミングに関しての内容です。いよいよプログラムの中身に入っていきます。

前提条件

基本的なこと

  • スクリプトはPython 3.3の文法で書きますスクリプトは Python 3.0 の文法で記述します。 (2013/3/19 バージョンが間違っていたので訂正します)

 2.7以前の書き方は使えません。

 前回で説明した Pythonコンソール,テキストエディタのウィンドウでは日本語等2バイト文字の入力、表示はできなそうです。(2013/3/19 追記:Windows版ではできないですがLinuxでは可能だと情報をいただきました)外部エディタで編集したものを読み込んで実行する場合は、日本語も利用できます。UTF-8で書けば、コメントや文字列リテラルに日本語を含められます。*1

APIについて

 Blender Pythonでは、bpyモジュールが組み込まれていて、Blenderに関する操作はその中で定義されています。
下記のようにインポートして利用できます。*2

import bpy

bpyの中でさらにいくつかのサブモジュールに分かれています。よく利用すると思われるものを下に挙げます。それぞれのモジュールがどのような役割なのか構成が分かれば、期待した処理を行うモジュールを見つけやすいのではないでしょうか。

 Blenderの操作に関するもの(opsはOperatorsの意味)。opsの中でさらにカテゴリごとにサブモジュール化されています。例:オブジェクト関連の操作は bpy.ops.object, メッシュ関連は bpy.ops.meshなど

  • bpy.context

 今現在アクセスしている状態に依存するメンバにアクセスできます。基本的に読み取り専用

  • bpy.data

 すべてのBlenderおよびPythonのデータの情報にアクセスできます

  • bpy.types

 Blender用のPythonクラス型が定義されています

モードの切り替え・取得

  • bpy.ops.object.mode_set(mode='OBJECT', toggle=False)

 現在のモードを指定したものに切り替える
modeに指定できるのは'OBJECT','EDIT','SCULPT','VERTEX_PAINT','WEIGHT_PAINT','TEXTURE_PAINT','PARTICLE_EDIT','POSE' のいずれかの文字列です。

  • bpy.context.mode

 現在のモードを取得する(読み取り専用)。
 戻り値は文字列で返ってきます。
   オブジェクトモード → 'OBJECT'
   編集モード(メッシュ) → 'EDIT_MESH'
   編集モード(アーマチュア) → 'EDIT_ARMATURE'
   頂点ペイント → 'PAINT_VERTEX'
  等々...
 上のmode_setで渡す文字列と若干違います。

モードを設定するのはBlenderに対する操作なので bpy.ops、取得は現在のコンテキストの状態を取得するので bpy.context からアクセスします。

  • bpy.ops.object.add(type='EMPTY', view_align=False, enter_editmode=False, location=(0.0, 0.0, 0.0), rotation=(0.0, 0.0, 0.0), layers=(False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))

 現在のシーンにオブジェクトを追加する
 Blender上からの操作では、3D ViewウィンドウでShift+Aからのオブジェクトの追加に当たるコマンドです。
 すべての引数は省略可能で、指定するときは type=hogehogeのようなキーワード引数形式で指定する必要があります。
typeには追加するオブジェクトの種類を'MESH', 'CURVE', 'SURFACE', 'META', 'FONT', 'ARMATURE', 'LATTICE', 'EMPTY', 'CAMERA', 'LAMP', 'SPEAKER'のいずれかを指定します。
 bpy.ops.objectにはempty_add, camera_add,armature_addなど、typeの引数だけが外れた特定の種類のオブジェクトを追加するメソッドもあります。詳しくはbpy.ops.objectAPIリファレンスを参照してください。

  • bpy.ops.mesh.primitive_xxx_add(view_align=False, enter_editmode=False, location=(0.0, 0.0, 0.0), rotation=(0.0, 0.0, 0.0), layers=(False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))

 基本形状のメッシュオブジェクトの追加
 指定可能な形状は下記のとおりです。

  • bpy.ops.mesh.primitive_circle_add 円
  • bpy.ops.mesh.primitive_cone_add 円錐
  • bpy.ops.mesh.primitive_cube_add 立方体
  • bpy.ops.mesh.primitive_cylinder_add 円柱
  • bpy.ops.mesh.primitive_grid_add グリッド
  • bpy.ops.mesh.primitive_ico_sphere_add ICO
  • bpy.ops.mesh.primitive_monkey_add モンキー
  • bpy.ops.mesh.primitive_plane_add 平面
  • bpy.ops.mesh.primitive_torus_add トーラス
  • bpy.ops.mesh.primitive_uv_sphere_add UV球

例: 座標(1, 0, 0)の場所にに z軸周りに45°傾けた立方体を追加する

bpy.ops.mesh.primitive_cube_add(location=(1, 0, 0), rotation=(0, 0, pi * 0.25))

情報の取得系の操作

  • bpy.context.object

 現在アクティブなオブジェクトを返す。
 アクティブなオブジェクトが存在しないときはNoneを返す。

  • bpy.context.selected_objects

 編集されているオブジェクトをリスト形式で返す。

オブジェクトはbpy.types.Object型で返ってきます。

bpy.types.Object クラスのメンバーはたくさんあるので一部だけ紹介します。下記に紹介したものは取得と代入が可能です。

  • name

 名前

  • location

 座標

  • scale

 スケール

  • select

 選択されているか否か 

  • hide

 非表示状態か否か 

実装例のサンプル

ソースコード

import bpy

for i in range(4):
  bpy.ops.mesh.primitive_cone_add()  # 円錐のメッシュを追加
  cone = bpy.context.object          # 直前で追加されたメッシュが取得される
  cone.location = (i * 2, 0.0, 0.0)  # メッシュの座標をx軸方向にずらしながら設定する

実行結果
f:id:Synd:20130211213439p:plain

その他にもさまざまなメンバーがあるのでAPIリファレンスを確認してください。


次回につづきます。

*1:ただ、海外製のソフトウェアではマルチバイト文字関連のバグは付き物なのであまり多様はしたくはないですが

*2:Pythonコンソールウィンドウでは、bpyモジュールが最初からインポートされています。

3DモデリングソフトBlenderでプログラミング(導入編)

 何故か最近3Dモデルを作成してゲームなど作る機会があって、Blenderという3Dモデリングソフトを使っています。*1
他ソフトと連携させるためにモデルのオブジェクト名を連番で並べたり、頂点の座標情報を取ってきてゴニョゴニョしたりプログラマブルなことをやりたいなと思っていましたが、Blenderには、Pythonでスクリプトを実行したり、アドオンの開発をしたりする機能が備わっていることを思い出しましてBlenderPythonブログラミングに手を出し始めたところです。

この辺のことに関しては、まだネット上の情報は多くないので、情報共有も兼ねて(私も完全に把握できてはいませんが)、調べつつ書き留めていきたいと思います。

  • 当ブログで想定している環境

プログラミング開始前の設定

日本語化

 現在のバージョンでは、デフォルトで日本語化に対応しています。なお、私は今まで日本語化によって不具合に当たったことはありません。

  • 画面上にあるメニューからFile→User Preferencesを選択する
  • Blender User Preferencesのダイアログが表示されるので、Systemタブを選択する
  • 右下のInternational fontsのチェックを入れる
  • Languageのリスト一覧から日本語を選ぶ
  • Translateのinterface, tooltipにチェックを入れる

 以上の手順を行うとメニューがすべて日本語に切り替わるので、ダイアログ下の「デフォルトとして保存」を押して次回以降、日本語のUIで起動できます。

コンソールを表示させる

 スクリプトの実行では、標準出力やエラー出力がコンソールに吐かれることがあります。コンソールは通常起動時には非表示になっていますが、情報ウィンドウのヘッダ→ウィンドウ→Toggle System Console を選んで表示/非表示を切り替えられます。また、コマンドプロンプトから直接Blender.exeを起動する、もしくは起動時の引数に --start-console を付けて起動することで常に表示させておくことができます。デバッグのための出力やエラー内容の確認のために、開発時には表示しておくことをお勧めします。

f:id:Synd:20130211043944p:plain

操作履歴を見る

 情報ウィンドウには、Blenderから行われた操作が履歴として出力されます。すべての操作は表示されませんが、実際にBlenderで操作を行って、それをスクリプト上で再現するのにどのメソッドを呼び出せばよいかを確認するのには使えると思います。

f:id:Synd:20130211013438p:plain:w360

 ちなみに、Blenderのデフォルトのレイアウトの一番上のメニューの様になっているところは、実はヘッダ*2分の高さしか見えていない情報ウィンドウになっているので、情報ウィンドウの境界をドラッグして位置を引き下げれば、操作した履歴を見ることができます。

f:id:Synd:20130210011601p:plain:w500

プログラムを書く

 Blender Pythonプログラムを書くための方法がいくつかあります。

Pythonコンソール

f:id:Synd:20130211005641p:plain

 ウィンドウタイプ一覧からPythonコンソールを選択して表示させます。
 Pythonコンソールは、画像の様にPythonインタプリタをインタラクティブモードで実行したような画面になっています。動作もインタラクティブモードとほとんど同じように、一行毎にプログラムが実行されて、返された結果が出力されます。
 そして、このコンソールでは、入力途中でCtrl+Spaceキーを押すことで入力補完ができます。候補が複数存在するときは利用可能な変数やメソッドの候補一覧が表示されます。
 dirやhelpなどのpythonのビルトイン関数*3と合わせてライブラリのクラスやメソッドを確認するのに大変重宝します。

f:id:Synd:20130211011114p:plain:w300

Blender内のテキストエディタ

 Pythonコンソールと同じように、ウィンドウタイプ一覧からテキストエディタを選択します。

f:id:Synd:20130211034109p:plain:w450

 ウィンドウのヘッダにあるNewボタンを押すと、テキストファイルが新規作成されます。スクリプトを書いて、テキスト>スクリプト実行(ショートカットキー:Alt+P) から中身を実行することができます。テキストエディタには、プリセットでスクリプトテンプレートがいくつか用意されているので、実装の参考になるかもしれません。ヘッダのテキストメニューから編集したスクリプトをファイルに保存したり、ファイルから読み込むこともできます。

外部のテキストエディタ

 自分の使い慣れたエディタや、コーディングを補助する機能があるエディタを使いたい人も多いと思います。
 上記のBlenderウィンドウのテキストエディタからファイルシステムに保存したもの(もしくは既存のPythonスクリプトのファイルを読み込んだもの)は、実際のファイルと関連付けられています。そのスクリプトファイルを、お使いのエディタで開いて編集・上書き保存をしてBlenderに戻ると、外部からファイルが変更されたことが検出されて下記のようなマークが出てきます。そのマークを押して再読み込み(ショートカットキー:Alt+R)して変更を反映して、上記の手順でスクリプトを実行できます。

f:id:Synd:20130211042109p:plain

終わりに

 次回から実際にBlenderでプログラムを書いていきます。Blender自体の操作方法や3DCGモデリングの用語等については、他のWebページの解説や参考書でご確認ください。
最後に個人的におすすめのサイトや書籍を載せておきます。

次回に続く

  • ↓入門書としても内容がしっかりしていて丁寧で非常にお勧めできます

キャラクターをつくろう!  3DCG日和。 vol.3 -Blenderでつくる、ポリゴンキャラクター

キャラクターをつくろう! 3DCG日和。 vol.3 -Blenderでつくる、ポリゴンキャラクター

*1:Blenderオープンソースで開発されている3DCG作成ツールです。

*2:各ウィンドウでメニュー等が表示されているバーをヘッダといいます

*3:dir()関数は、モジュールやオブジェクトを引数に渡すと、そこで定義されているものの一覧が文字列リストで返します。help()関数は、クラスやメソッドを引数に渡すとそれに関するドキュメントを見ることができます。

Play Frameworkを使ってみた

f:id:Synd:20130203193602p:plain最近流行り?のウェブアプリケーションフレームワーク Play Frameworkを使うことになりました。
使い方などをメモしていきます。

今回は、まずは導入の仕方などについて。。。

自分の環境

ダウンロード

http://www.playframework.org/
上のURLからPlayの最新版ダウンロード。

私は現時点で最新版のPlay 2.1 RCを落としました。安定版のバージョン2.0.4とRC版の2.1がありますが、どちらでも大差はないはずです。

そして、ダウンロードして展開したものを適当な場所に置き
play.batがあるフォルダの場所にパスを通します。

早速Webアプリを作成する

コマンドラインを立ち上げます。

下記のコマンドを入力すると、現在いる位置のフォルダ直下で、プロジェクトが新規作成されます。

% play new [プロジェクト名]

今回は例としてHelloWorldという名前で作成。

% play new HelloWorld

f:id:Synd:20130203183503p:plain

Playのロゴが立ち上がり、いくつか質問されます。

What is the application name? [HelloWorld]

アプリケーション名を決められるらしい。
何も入力せずにEnterでプロジェクト名と同じになります。

Which template do you want to use for this new application?

  1       - Create a simple Scala application
  2       - Create a simple Java application

雛形のソースコードJavaで作るかScalaで作るか聞かれます。
私はScalaに詳しくないのでとりあえず今回は2のJavaで作ります。

これで新規プロジェクトが作られました。
HelloWorldというディレクトリが新たに生成されたと思います。

% cd HelloWorld

プロジェクトのフォルダ内に移動します。

% play run

と打つと、Play Frameworkに用意されているWebサーバで現在のプロジェクトのサービスが立ち上がります。

f:id:Synd:20130203190629p:plain

初回はやや時間がかかりますが、Readyとなったらブラウザで http://localhost:9000/ へ行って確認してみましょう。

f:id:Synd:20130203193602p:plain

このように表示されたら成功です!
デフォルトでは9000番ポートで走ります。
別のポートで走らせたいときは、下記の様にポート番号を指定します(ダブルクォーテーション"~"で囲む場所に注意)

% play "run [ポート番号]"

例:8080番ポートで起動

% play "run 8080"


最後にPlayで開発する際に留めておきたい注意点をいくつか。

  • Play Frameworkはバージョン2.0以降から大幅な変更があり、それ以前のネット上の情報がそのまま使えないことも多いです(当ブログではすべて2.0以降のものを使います)
  • また、2.0からフレームワークの設計がScalaベースになったため、Javaだけでなく多少はScalaで書く必要があります(テンプレートエンジン周りなど)


実際にアプリの中身を作っていくところは次回以降!

それでは(^^)/~~~