主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

Unity: 3Dオブジェクトを作る方法

                
tags: Unity 3DCG
 今日はUnityで使う3Dオブジェクトの作成方法をフリーのソフトを使って少し。3Dオブジェクトはキャラクターのような複雑な面を持つものでなく、わりと規則的な面を持つ建物を扱う。まずは下の写真にあるような、ガラスのはめ込まれたアーチ状の天井を作ってみようと思う。
CIMG0250.jpg

 Unityでも3Dオブジェクトを作ることはできるが、作成ツールとしてはすぐれていない。その代わりにBlenderやLightWaveのような様々なソフトからデータをインポートできる。というわけでまず、3Dオブジェクトを作るには外部ソフトを使うことにする。
 まず有名どころのフリーソフトではBlenderがある。フリーとは思えないほどに機能が豊富なのだけど、豊富さがかえって操作を複雑にしている。これではなかなかモデリングが難しい。
 フリーのモデリングソフトを探してみたが、CAD界の老舗であるAutodesk社の123D Designが低機能ながらモデリングツールとしてはかなり使いやすそう。出力形式がこのアプリケーションオリジナルかSTLの二択。オリジナルの方はほかのソフトで使えないので事実上はSTL一択。そんでもってSTLはメッシュ情報のみ記録し、拡散反射率や鏡面反射率は保存できない。…それでもモデリングツールとしては使いやすいので、この123D Designでモデリングし、それをBlenderに読み込んで各種光学パラメータを設定したりテクスチャを貼りつけて仕上げればよさそう。というわけで実際にアーチの天井を形づくってみた。

まず123D Designで形を作る
13103101.jpg


続いてBlenderで光学特性などを設定
13103102.jpg


試しにレンダリング
13103103.png

さらにテクスチャ貼り付け、デュプリケイトを行った
render1.png


十分な結果が得られた。123D Design + Blenderというフリーソフトの組み合わせで、建造物の3Dオブジェクトでもそれなりのものが作れそうだ。

 ちなみに123D Designの使い方は公式チュートリアルより下記の方が参考になった。
http://hi-rom.com/labs/3d_printer/123d_design.html
スポンサーサイト



Unity: TPS視点を導入してみる

                
tags: C# Unity
http://unity3d.com/learn/tutorials/projects/stealth
Unityのサンプルプロジェクトとして、ステルスゲームがある。それなりの容量のステルスゲームを作りたいと考えていたのでそのサンプルプロジェクトを勉強がてら触ってみたのだけど、視点が上空からの追尾。これじゃ探索するという感覚が薄いので、背後からの視点を追加してみた。
13102201.jpg

      ↓

13102100.jpg



背後からの視点の導入にあたってカメラを主人公のやや後方から追尾させる必要があった。主人公のやや『後方』にカメラを置く。そのために『後方』を表すベクトル値を取得せにゃいけないのだけど、どうやって取得するか。
最初は三角関数を使って、主人公オブジェクトの向いている方向から算出した。下記のように。
var angle = Mathf.Deg2Rad * transform.eulerAngles.y;
var x = -viewDistance * Mathf.Sin(angle);
var z = -viewDistance * Mathf.Cos(angle);
var vec = new Vector3(x, viewHeight, z);


知ってる知識を使って目的を達する処理をとりあえず書いてみたけど、このぐらいならメソッドなりプロパティで使えるようなものが用意されているか……と考えてリファレンスに目をとおしたところやっぱりあった。
var vec = - viewDistance * player.forward;
vec.y = viewHeight;


やっぱりリファレンスにざっと目をとおしてどんなクラスがあるか一通り知っておいた方がコーディングが楽になりそうだ。

Unity: 最初の一歩

                
tags: Unity Boo
Windows 7, 64bit



 近年に出てきたゲーム開発環境としてUnityなるものがある。WindowやLinux、Macなどのデスクトップ向けOSはもちろん、iOSやAndroidなどに向けたゲームをビルドできるソフトだ。モデルやBGMをそろえるストアも整理されており、無料のものから有料のものまでいろいろとゲーム素材を手に入れることができる。
 
 ゲームを作るなら、以前はマイクロソフトからXNA Frameworkなるものがダウンロードできた。あれはコードでいろいろ書いていくもので、アルゴリズムの理解などなかなかのレベルが要求されるものだった。
 
 Unityでゲームをつくるのはかなり楽である。ストアからキャラクタモデルで必要そうなものをもってきて、GUIに表示されているシーン上にそのモデルを配置して、GUIで物理演算をどうするか設定して、あとはイベント発生時の挙動をコードで書く。CGソフトとよく似ているように思う。
 『Unity』とはよく言ったもので。ソフト関連の界隈には適当に名前を付けられたようなものがあれば、機能をうまく名前で表したものもある。Unityは後者だろう。モデルデータ、プログラムコードなどを統合して一つのゲームをつくりあげる。モデル作成したけりゃ手慣れたソフトを、コード書きたきゃ自分のよく使うソフトを使えばいい。それらのパーツを一つに統合するのがUnityの仕事だ。
 
 Unityではコーディングに使える言語が3つある。C#,Boo,JavaScript(もどき)だ。どの言語を使おうかというときの指標の一つになるのがパフォーマンスだが、たいていはパフォーマンス上では三者間で違いはでないか、微々たるものだろう。以前に.NET上でC#とBooのパフォーマンスを比べたが違いは全然出なかった。BooのコンパイラはC#で書かれているからC#には劣るというのをどっかで見た気がするが、こんな理屈はおかしい。コンパイラがなにで書かれていようと、Monoではコードが共通言語(IL)にコンパイルされる。パフォーマンスを決めるのはコンパイラがどの言語で書かれているかでなく、コンパイルで出力される共通言語コードがどういう手順で目的処理を実行しているかである。
 
 
 
 Unityでなんでもいいからとりあえず一つ作ってみたいとなると、モデルはストアから無料のものを持って来ればいい。ほかに必要なのはコーディングに使うソフトである。テキストエディタでもすむが、予測入力があると助かるので統合開発環境があると楽。Unityのインストール時にMonoDevelopがオプションで選べる。ちょっと使ってみたがキーボード入力がUSタイプになっていて、どこから設定を変えるのか分からないので使うのをやめた。統合開発環境はここのところずっとSharpDevelopなるVisualStudioに酷似した.NET向けアプリケーションのものを使っている。Unityのためのコーディングでもこれを使うことにした。Unityの『Edit』→『Preferences』→『External Script Editor』とたどって行けば統合開発環境を設定できる。これの設定を変えると、Unity内のウィンドウでコードファイルを右クリックしたときに出るSync MonoDevelop Projectで設定された統合開発環境でコード編集を立ち上げられる。
 
 あとはBooでのコーディングに関してちょっと。UnityEngineのインポートと、MonoBehaviourの継承をしておき、クラスにはStartメソッドとUpdateメソッドを定義しておくこと。あとBooはPythonというよりC#っぽいところがある。変数や定数はクラスのなかで定義すること。
import UnityEngine

class CharacterScript (MonoBehaviour):
itemCount as int = 3
itemData as List = []
flgData as List = []
gameFlg as bool = true
playTime as int = 300


def Start ():
print "start"
SetupItem()
animation.Play("idle")
GameObject.Find("msg").guiText.text = ""
GameObject.Find("itemCount").guiText.material.color = Color.blue

def Update ():
if not gameFlg:
return
CheckTime()
CheckItemCount()
CheckEnd



Unityでのゲーム作りの初歩が学べるいい本だった。↑の本を読みつつ、ごく初歩的な迷路のサンプルを書き換えてみた。カーソルキーを押すことで球に直接力を加えられるゲームだった。せっかく物理エンジンを使っているので、カーソルキーで台を傾けて、重力で球が転がるようにした。

一つ気になったのはコードでの命名規則。Unityで書くコードはMonoで処理される。つまり命名規則は.NET Frameworkと共通。だからJavaScriptでコーディングしようと、関数やメソッドはPascalケースでやるべきだと思う。公式にあるサンプルではそうなっている。
http://unity3d.com/learn/tutorials/projects/stealth/alarm-lights

130924.jpg

プロフィール

h

Author:h

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon