unityでマテリアルの設定と切り替え
unityでマテリアルを扱う場合は、外部の3Dソフトでモデリングし設定されたマテリアルをunityに読込む(インポート)のが普通かと思いますが、それとは別にunity上でマテリアルを作ることができます。
新規のマテリアルを作る
「Creat」から「Material」を選び、できたマテリアルのshaderの種類を決めて、あとは色を設定します。写真の例では単純なDiffuseマテリアルです。

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

他にもshaderの項目でスペキュラーやテクスチャを設定できます。最初からいろんなマテリアルが付いているので、大抵は大丈夫な感じです。それでも足りないという時にはasset storeのマテリアルを購入ですね。細部の内容は本家のリファレンスをどうぞ。
またスクリプトでマテリアルを作ることもできますが、個人的にはカラーなどはその場で見ながらの方がいいし、スクリプトを覚えなくて済むのでので使わないかなと。
マテリアルの切り替え
マテリアルの切り替えは単純にrenderer.materialに代入するだけ。
以下のスクリプトはボタンをクリックすることでマテリアルを切り替えています。「NewCube!」をクリックすることでCubeを生成できます。
(動作させるにはプリミティブのCubeと空のオブジェクトと最低2つのマテリアルがいります)
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;
}
unityをサイトに埋め込んだらかなり重くなってしまったので、これからは別ページに表示させることにしました。
物理演算は楽しいなぁ。
unityでプリミティブprimitive形状を生成する
unityでプリミティブprimitive形状を生成するやり方。
単純に生成するだけなら以下のjavascriptでよし。
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
これでできたcubeに対してRigidbodyやらpositionやらを設定していきます。
プリミティブ形状を生成して色々設定してみる
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;
}
上記ではfor文でプリミティブ形状を生成し、Rigidbodyと(物理演算ができるようになる)、positionとeulerAngles(角度?)を付けています。
もう一つは地面の形状として、cubeを生成して、大きさを1000倍にしています。Rigidbodyはつけていないけど、プリミティブの時点でcolliderはついているのでcubeが着地できます。
Random関数がよく分からなかった・・・。
unityをhtmlに埋め込むやり方
flashと同じく、unityをhtml(サイト)に埋め込むにはjavascriptを使う必要があります。もしかしたらhtmlのembedタグでできるかもしれませんが、枠ができたり一旦クリックしなくてはいけなかったりする可能性がありますし、結局たいしてコードが短いわけでもないのでjavascriptがよいかと思います。
javascriptをhead内に埋め込む
共通で使う以下のタグをjavascriptをheadタグ内に埋め込みます。
<script type="text/javascript" src="http://webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject.js"></script>
単独の記事向けにjavascriptを埋め込む
サイト内にunityのオブジェクトが1つしかない場合はheadタグ内にもう一つjavascriptを埋め込むのですが、ブログなどの場合は記事内にjavascriptを埋め込みます。
<script type="text/javascript">
unityObject.embedUnity("unityPlayer", "WebPlayer.unity3d", 600, 450);
</script>
上記のスクリプトの各項目です。
<script type="text/javascript">
unityObject.embedUnity("ページでユニークなid要素名", "データのパス", 横幅, 縦幅);
</script>
htmlの記述例
javascriptに続けて、htmlも埋め込みます。これはブラウザにunityのプラグインがインストールされていない場合には「インストールしてね」って表示される内容も含まれています。
<div id="unityPlayer"> <div class="missing"> <a href="http://unity3d.com/webplayer/" title="Unity Web Player. Install now!"> <img alt="Unity Web Player. Install now!" src="http://webplayer.unity3d.com/installation/getunity.png" width="193" height="63" /> </a> </div> </div>
上記の例のidが「unityPlayer」となっていますが、ここは任意で決めます。javascriptの「ページでユニークなid要素名」と同じ名前にします。
上のアレは画面にプリミティブオブジェクトを生成してRigidbodyを付けて〜な感じですが、次の記事にて。
Unityでマウスドラッグしてオブジェクトを回転させる
unityでマウスドラッグしてゲームオブジェクトを回転される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);
}
}
Input.GetMouseButtonDown(0)が左クリックを押した瞬間、Input.GetMouseButton(0)が押している状態です。
- unityで実際に使用する時は、「project」ウィンドウで「Create」→「javascript」でスクリプトを追加し、上記のスクリプトをペーストして保存します。
- 次に上部メニューから「GameObject」→「Create Empty」で空のGameObjectを追加し、そのGameObjectに先ほど保存したjavascriptをドラッグして追加してやります。
- 最後にjavascriptの項目に「RotateTarget」があり、(none)となっている部分に回転されたいオブジェクトをドラッグします。

【サンプル】Unityでマウスドラッグしてオブジェクトを回転させる
あと上の図の「Xsped」と「Yspeed」を変えてやることでドラッグのスピードが変えられます。数値が高い方がゆっくりになります。
できれば@marupuraさんがこのスクリプト使ってもらって、ムキムキのモデルをグリグリしたい!
Gameobject名とボタンイベントの取得
ボタンのイベントを取得して、それをGameObjectに適応させるようにします。
ボタンを押したときのイベントの取得
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("クリックされた");
}
}
上記のサンプルではOnGUI()の関数内でしかオブジェクト名が指定できないので、変数を関数の外に出してやることで解決できます。でもbt1は初期化していないけどいいのかな?
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("クリックされた");
}
}
さて私はUnityをosx環境のjavascriptでテストしているわけですが、これだとscriptの記述が「Unitron」という最初から付いているアプリケーションを使うことになります。
しかしこれがコード補完はしないし特別な機能がついているわけでもないので辛い。WindowsならUnityDevelopがありますが、Macにはありません。MonoDevelopがあるじゃないかと思いきやC#とBoo(?)にしか使えません。結局「Coda」というウェブ制作、html制作者達のアプリケーションを使っています。
そして「Coda」でUnity用のコード補完してくれるプラグインがありました。
やったー!と思いきや大文字と小文字を微妙に間違えてくれる厄介使用。クワー。

