Month: 6月 2011

unityでマテリアルの設定と切り替え

unityでマテリアルを扱う場合は、外部の3Dソフトでモデリングし設定されたマテリアルをunityに読込む(インポート)のが普通かと思いますが、それとは別にunity上でマテリアルを作ることができます。

新規のマテリアルを作る

「Creat」から「Material」を選び、できたマテリアルのshaderの種類を決めて、あとは色を設定します。写真の例では単純なDiffuseマテリアルです。
新規マテリアルmaterialを作る

透明なマテリアルを作る

半透明なマテリアルを作りたい場合はshaderを「Transparent」などにして、カラーをRGBつまみの下のアルファを設定することで半透明なマテリアルができます。
半透明なマテリアルの作り方

他にもshaderの項目でスペキュラーやテクスチャを設定できます。最初からいろんなマテリアルが付いているので、大抵は大丈夫な感じです。それでも足りないという時にはasset storeのマテリアルを購入ですね。細部の内容は本家のリファレンスをどうぞ。
またスクリプトでマテリアルを作ることもできますが、個人的にはカラーなどはその場で見ながらの方がいいし、スクリプトを覚えなくて済むのでので使わないかなと。

マテリアルの切り替え

マテリアルの切り替えは単純にrenderer.materialに代入するだけ。
以下のスクリプトはボタンをクリックすることでマテリアルを切り替えています。「NewCube!」をクリックすることでCubeを生成できます。
(動作させるにはプリミティブのCubeと空のオブジェクトと最低2つのマテリアルがいります)
[javascript]
var prefabcube:GameObject;
var M_ice:Material;
var M_diff:Material;
var MS_cube:Material;

function Start () {

//Ground
var groundcube = gameObject.CreatePrimitive(PrimitiveType.Cube);
groundcube.transform.position = Vector3(0,0,0);
groundcube.transform.localScale.x = 1000;
groundcube.transform.localScale.z = 1000;

//default Material
MS_cube = M_ice;
}

function OnGUI () {

//Button
var BT_newcube = GUI.Button(Rect(10,10,120,30),”newCube!”);
var BT_changeM1 = GUI.Button(Rect(140,10,120,30),”Change Material1″);
var BT_changeM2 = GUI.Button(Rect(270,10,120,30),”Change Material2″);

if(BT_newcube){
cuberain();
}
if(BT_changeM1){
MS_cube = M_diff;
}
if(BT_changeM2){
MS_cube = M_ice;
}
}

function cuberain() {
var incube : GameObject = Instantiate(prefabcube, transform.position, transform.rotation);
incube.AddComponent(Rigidbody);
incube.renderer.material = MS_cube;
}
[/javascript]

unityをサイトに埋め込んだらかなり重くなってしまったので、これからは別ページに表示させることにしました。

【マテリアル切り替えサンプル】

物理演算は楽しいなぁ。

unityでプリミティブprimitive形状を生成する

unityでプリミティブprimitive形状を生成するやり方。
単純に生成するだけなら以下のjavascriptでよし。
[javascript]
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
[/javascript]
これでできたcubeに対してRigidbodyやらpositionやらを設定していきます。

プリミティブ形状を生成して色々設定してみる

[javascript]
var cubenum:float = 5;
var cubeposition:float = 0;

function Start () {

for (var i= 0; i < cubenum; i++){

var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.AddComponent(Rigidbody);

cube.transform.position = Vector3(cubeposition,10,0);
cube.transform.eulerAngles = Vector3(cubeposition,cubeposition*3,cubeposition*10);
cubeposition += 5;

}

//Ground
var groundcube = gameObject.CreatePrimitive(PrimitiveType.Cube);
groundcube.transform.position = Vector3(0,0,0);
groundcube.transform.localScale.x = 1000;
groundcube.transform.localScale.z = 1000;

}[/javascript]

上記ではfor文でプリミティブ形状を生成し、Rigidbodyと(物理演算ができるようになる)、positionとeulerAngles(角度?)を付けています。

もう一つは地面の形状として、cubeを生成して、大きさを1000倍にしています。Rigidbodyはつけていないけど、プリミティブの時点でcolliderはついているのでcubeが着地できます。

Random関数がよく分からなかった・・・。

unityをhtmlに埋め込むやり方

flashと同じく、unityをhtml(サイト)に埋め込むにはjavascriptを使う必要があります。もしかしたらhtmlのembedタグでできるかもしれませんが、枠ができたり一旦クリックしなくてはいけなかったりする可能性がありますし、結局たいしてコードが短いわけでもないのでjavascriptがよいかと思います。

javascriptをhead内に埋め込む

共通で使う以下のタグをjavascriptをheadタグ内に埋め込みます。
[javascript]

[/javascript]

単独の記事向けにjavascriptを埋め込む

サイト内にunityのオブジェクトが1つしかない場合はheadタグ内にもう一つjavascriptを埋め込むのですが、ブログなどの場合は記事内にjavascriptを埋め込みます。
[javascript]

[/javascript]

上記のスクリプトの各項目です。
[javascript]

[/javascript]

htmlの記述例

javascriptに続けて、htmlも埋め込みます。これはブラウザにunityのプラグインがインストールされていない場合には「インストールしてね」って表示される内容も含まれています。
[javascript]

[/javascript]

上記の例のidが「unityPlayer」となっていますが、ここは任意で決めます。javascriptの「ページでユニークなid要素名」と同じ名前にします。

上のアレは画面にプリミティブオブジェクトを生成してRigidbodyを付けて〜な感じですが、次の記事にて。

Unityでマウスドラッグしてオブジェクトを回転させる

unityでマウスドラッグしてゲームオブジェクトを回転されるjavascript。
他のやり方もたくさんあるかと思いますが、紹介するやり方はマウスの左クリックを押した瞬間と左クリックを押している状態のメソッドを組み合わせた簡単なものです。これだけでも時間かかりましたが・・・。
[javascript]
var rotatetarget:Transform;
var xspeed:float = 100;
var yspeed:float = 100;

private var sx:float;
private var sy:float;
private var dx:float;
private var dy:float;
private var tx:float;
private var ty:float;

function Update() {

//Start
if(Input.GetMouseButtonDown(0)) {
//Input Mouse position
sx = Input.mousePosition.x;
sy = Input.mousePosition.y;
}
//Drag
if(Input.GetMouseButton(0)) {
dx = Input.mousePosition.x;
dy = Input.mousePosition.y;

tx = sx – dx;
ty = sy – dy;

//Rotate!
rotatetarget.Rotate( ty / yspeed , tx / xspeed , 0);
}
}[/javascript]

Input.GetMouseButtonDown(0)が左クリックを押した瞬間、Input.GetMouseButton(0)が押している状態です。

  • unityで実際に使用する時は、「project」ウィンドウで「Create」→「javascript」でスクリプトを追加し、上記のスクリプトをペーストして保存します。
  • 次に上部メニューから「GameObject」→「Create Empty」で空のGameObjectを追加し、そのGameObjectに先ほど保存したjavascriptをドラッグして追加してやります。
  • 最後にjavascriptの項目に「RotateTarget」があり、(none)となっている部分に回転されたいオブジェクトをドラッグします。

マウスmouseのドラッグdragでオブジェクトを回転rotateさせる

【サンプル】Unityでマウスドラッグしてオブジェクトを回転させる

あと上の図の「Xsped」と「Yspeed」を変えてやることでドラッグのスピードが変えられます。数値が高い方がゆっくりになります。
できれば@marupuraさんがこのスクリプト使ってもらって、ムキムキのモデルをグリグリしたい!

Gameobject名とボタンイベントの取得

ボタンのイベントを取得して、それをGameObjectに適応させるようにします。

ボタンを押したときのイベントの取得

[javascript]
var bt1width = 120;
var bt1height = 40;

var bt1x = 10;
var bt1y = 10;

//GUIの設定
function OnGUI () {

var bt1 = GUI.Button(Rect(bt1x,bt1y,bt1width,bt1height),”bt1″);

//Click Button Event
if(bt1) {
Debug.Log(“クリックされた”);
}
}[/javascript]

上記のサンプルではOnGUI()の関数内でしかオブジェクト名が指定できないので、変数を関数の外に出してやることで解決できます。でもbt1は初期化していないけどいいのかな?

[javascript]
var bt1width = 120;
var bt1height = 40;

var bt1x = 10;
var bt1y = 10;

var bt1;

//GUIの設定
function OnGUI () {
bt1 = GUI.Button(Rect(bt1x,bt1y,bt1width,bt1height),”bt1″);
}
function Update () {

//Click Button Event
if(bt1) {
Debug.Log(“クリックされた”);
}
}[/javascript]

さて私はUnityをosx環境のjavascriptでテストしているわけですが、これだとscriptの記述が「Unitron」という最初から付いているアプリケーションを使うことになります。
しかしこれがコード補完はしないし特別な機能がついているわけでもないので辛い。WindowsならUnityDevelopがありますが、Macにはありません。MonoDevelopがあるじゃないかと思いきやC#とBoo(?)にしか使えません。結局「Coda」というウェブ制作、html制作者達のアプリケーションを使っています。
そして「Coda」でUnity用のコード補完してくれるプラグインがありました。

Unity Community

やったー!と思いきや大文字と小文字を微妙に間違えてくれる厄介使用。クワー。

unityでスクリプトによるボタンの配置

unityでもGUI操作だけでゲームができるわけではなく、やはり3Dをやっている人にとっては鬼門?のscriptを記述してやる必要があります。
言語はjavascriptとC#が使えますが、手軽に使えるjavascriptは中級者まで、ちょっと記述する内容がめんどくさいけど本格的にやるならC#というイメージです。私はもちろん手軽なjavascriptで。
unityでscriptを使う時はGameObjectに追加してやらないと動きません。それがオブジェクトではなく画面に配置するボタンなどのGUIの場合でも同様です。

scriptが使えるようにする

まずはscriptを入れるために、空のオブジェクトを作成し、javascriptを追加します。

次にjavascriptを先ほど追加した空のオブジェクトにドラッグします。これで準備完了。
(画像では名前をそれぞれ変えてあります)

テクスチャをGUI用に設定する

画像はpngやjpg形式のデータを「project」エリアにドラッグすることで使えるようになりますが、そのままだと「Texture」扱いになっている筈です。
この状態だと画像が本来の縦と横の比率を無視して広がってしまって面倒くさいしそもそも使い方が違うので、instectorタブで「GUI」に変更します。項目を変えたら「Apply」を押します。

次にjavascriptを選択してinspectorタブから「Edit」を押していよいよscriptを記述していきます。

javascriptの記述

「Edit」ボタンを押して出てきたテキストエディタに以下のように記述して再生させると単純なボタンが作られます。
[javascript]
function OnGUI () {
var bt1 = GUI.Button(Rect(10,10,160,40),”bt1″);
}[/javascript]

簡単な説明としては、GUI.Buttonでボタンを生成し、Rectでボタンの種類を四角形に、その引数は(X座標 , Y座標 , ボタンの横幅 , ボタンの縦幅)、GUI.Buttonの第2引数でボタンのテキストを記述します。
画像をボタンに入れる場合は、まず以下scriptを記述します。
[javascript]
var btB1 : Texture2D;
function OnGUI () {
var bt1 = GUI.Button(Rect(10,10,160,40),”bt1″);
GUI.Button (Rect(10,120,202,42), btB1);
}[/javascript]
これだけだとボタンには何も表示されません。javascriptを入れ込んだGameObjectを選択すると、inspectorタブにTextureを選べる項目がでるので、そこでTextureを選択して初めて表示されます(これがわからなくてハマった)。
正常にjavascriptが記述できていたらこんな感じになります。

クリックすると反応してくれます。いい感じですね。

scriptについては本家のサイトのマニュアル、リファレンスが充実していますし、他サイトもありますので参考にしてください。というか参考にさせて頂いております。

unity(スクリプトオーバービュー)
Unityドキュメント
Unity Games

© 2017 UXIC.net

Theme by Anders NorenUp ↑