2011年05月

2011年05月28日

はじめてのあなる

anal1

(4作目 4時間半くらい)


初あなる ということで 『あなる』こと『安城鳴子(あんじょうなるこ)』さんをスカルプトしてみました。
あなるさん 動いていると細身なんですけど 止め絵のイラストだと意外に肩幅が広くてがっしりしてるんですよ
なので 少し頭を小さめにしてみたら 腰が長いような気もします。うん まあ CGなのでプロポーションをいじるのは簡単です
塗りはさっくりとしました 実際にうごかすならもう少し書き込まないとダメでしょうけど 練習だし まあこんなもんでいいかな
 
このソフトなんだかファンド(石膏粘土)っぽくて暖かい感じが出るんですね。
ちなみにわたし もともとプロダクト系(工業デザイン)専攻だったので立体で作るほうが得意だったりするんです
学生時代はろくなもんつくってなかったですけどねw 
しかも最近は3DCGのデータから立体に出力もできるんですよ。 とはえまだ細かいところは直さなきゃダメですけど
お金と時間があったらリアルに立体で作りたいところです。それを売って おこずかいとかほしいしw


1304664025582
スカルプトについて前回の説明ではよくわからなかったかもしれませんのでサンプル画像を拾ってまいりました。
この画層にあるように 実際のゲームだと200万ポリゴンほどで作りこんだモデルをテクスチャに変換して
5000ポリゴン程度のゲームのモデルに貼り込むんですね 立体感は勝手に計算してモニター上での見た目は立体感があるようにしてくれます。そいつをやるのがシェーダーっていうやつですね。

仕事が入ったので来週は更新できないかもしれません。 が なるはやで復帰しますのでお待ちください
講座の4回目も執筆してますえー

akinow at 12:00|PermalinkComments(4)TrackBack(0) Clip to Evernote 日記 

2011年05月26日

今日のキノコ

P1000046P1000048


今日さっそく 新発売の ”大人の”きのこの山 というのを購入してきました
『おとな』のキノコ っていう洒落にならないエロっぽいネタなんですけど だいじょうぶなんでしょうか。

お味の方はオレンジのかおりのする ちょっと濃いめのチョコで お菓子の方もすこし大きめです。
普通においしいですが 想像の範疇の味かな。 タケノコの方はホワイトチョコなので好きではないので未購入。

まいんちゃんはタケノコ派だよね  え アスパラ?
966744bb




gater
前回 プレイヤー自機を製作するという告知をしたので いちおうポリゴンを組んでみたのですが、バーニヤの形状がいまいち決まらないのでデザインを保留しています。 あんまりやり過ぎるのも好きじゃないんですよね。
なんですけど もうちょっとお待ちください。 オーソドックスなデザインにするというところだけは決まっているので
あと ちょっとです。

で 月曜日あたりにSculptrisというアプリ(いわゆるスカルプト系アプリ)をダウンロードしてみたんですね。
触ったことはあったんですけどちゃんと作ったことがなくて なにか形にしてみようと思い立ちました。
なんでも 有名なZbrushの開発者がSculptris のあまりの出来の良さに、愕然としたとかいう話で
Sculptrisの作者は現在Zbrushの開発元Pixlogicに引きぬかれて社員になってしまいました。で次回のZbrushの
バージョンアップにはSculptrisの機能がつくらしいです。 でもみんなSculptrisつかうよねフリーだもの。
ただ程安いものはないです。 で使ってみて感想なんですけど ほんとにZbrushいらないくらい楽勝でスカルプト
できるんですよこれが。スカルプトって言うのは彫刻のことですけど CGの世界ではペンタブで彫刻のようにポリゴンをモリモリできるアプリのことをスカルプト系って呼ぶのです。最近のハイエンドゲームなどの細かい造形はすべてこのようなスカルプト系のアプリで作成されています。具体的にはローポリゴンのモデルにスカルプトしたデータをノーマルマップ(法線マップ)でテクスチャとして貼り込むんですが、こうした技術によってゲームのグラフィックは格段にリアルになってるんですね。
で とりあえず 筋肉をつくらねばと一作目を作ったんですけど また例の人に見せたらバキみたいで気持ち悪いとか言われましたよw まあ強調されたマンガの筋肉に近いんですけどね。筋肉っていうのは人によって気持ち悪いと見る人 と 美しいと見る人がいるんですが どちらが美的素養があるかはあえて書きませんぜw

そして2作目が革ジャン着たおじさん(またかw)
いつかおじさんのゲーム作ってみたいですな イージーライダーみたいなやつ。

もうちょっとsculptrisいじってみます 飽きたらゲーム制作に戻りますよー。



osan

とりあえず作ってみた 1作目 (作業:2時間半)


おやじスカルプ























とりあえず作ってみた 2作目 (作業:2時間)


素体ちゃん

とりあえず作ってみた 素体ちゃん 3作目 (作業:1時間ちょっと)
Sculptrisに興味を持たれた方に素体ちゃんデータを差し上げます。 モリモリすれば好みの娘になるはず はず?
dl.dropboxusercontent.com/s/dy6jxyxtdnyk2ms/figure_anig.sc1

akinow at 23:04|PermalinkComments(8)TrackBack(0) Clip to Evernote 日記 

うにばな (講座みたいなもの 第三回)

今回も関数の解説です。 解説なんかリファレンス見ればいいじゃんとおっしゃる方もいるかも知れませんが ひとつ

ジャッキーチェンの映画『酔拳』で毎日基礎ばっかりやらされて嫌気が刺したジャッキーがもっと派手な必殺技を教えてくれって師匠に頼むんですね
。それで師匠は一つ技を教えてくれて、ジャッキーがそれをケンカで試すんですけど全く技が決まらないんです。 で失敗に懲りて真面目に教えを乞うわけなんですがいつまでも強くならなかった。ですけどラストで師匠に襲いかかる敵に向かっていままで覚えた技を自分のアレンジで繰り出すことで敵を撃退してしまいます。そこで初めて真の格闘家としてのレールに乗ったんだよー と 終劇を迎えるというおはなしなんですが 勉強したことをそのまま憶えるだけでは力にはならない自分なりのやり方をみつける すなわち『応用』が最も大事なんだよと語ってるわけです 深いでしょ。
リファレンスはもちろん有効ですけど 格ゲーで言えば技一覧表のコマンドを眺めているのと同じで 戦いの仕方を学んだことにはならないわけなのです、どうやって技を組み合わせれば戦えるのか応用を考えていこうとしているのが、うちの記事です。っていうとちょっと大げさですねw たいしたもんじゃないです。


前回のおさらい

ゲームコントローラーっていうのはUnityに提供されるものではなくて ゲーム全体を統率するコントローラーとして定義したものです。 検索されてしまった方誤解を与えて申し訳ありません。
前回は大まかにゲーム全体の仕組みについてざっくりとおはなししました。

今回はオブジェクトの製作をする予定でしたが、すこし都合が変わりましたバレット(弾)の解説をします。経緯の詳細は次の記事を待ってもらうとして

弾のスクリプトの構造ですが 基本的な組み合わせで、弾は 

●移動、
●衝突判定、
●ダメージの送信


のスクリプト部分で構成されています。 ちなみに今回と次回の解説はとても重要です。
『enemyBulletScript.js』を中心にしておはなしをします。主に関数の解説です。



fig10




衝突判定

衝突する側にColliderと移動オブジェクトにはRigidBodyを設定していることが前提です。

■OnTriggerEnter()

fig11



//↓ Collider型のotherObjectという変数にOnTriggerEnterから衝突したコリジョンのデータが帰ります。

相手のオブジェクトColliderコンポーネントにはかならずtriggerにチェックが入っていることが条件です。

var explosion:Transform;

function OnTriggerEnter( otherObject: Collider ){
//↓コリジョンのオブジェクトにつけられたタグが”enemy”だった場合
if(otherObject.gameObject.tag == "enemy"){
//explosionのprefabがアサインされていたら
if(explosion){
// explosionのprefab(爆発のパターン)を表示(Instansiate)します
var tempExplosion: Transform;

tempExplosion = Instantiate(explosion, transform.position, transform.rotation);
}
//衝突したコリジョンのオブジェクトのApplyDamage() という関数にdamageの値を送信します
    otherObject.gameObject.SendMessageUpwards("ApplyDamage",damage,SendMessageOptions.DontRequireReceiver);

// このオブジェクト(弾)を破壊
Destroy(gameObject);

}

}

という流れです。
explosionは爆発のプレファブなのですが、スクリプト先頭でプレファブなどを宣言する場合
Instansiateで使用する前に『if(プレファブ名){}』としておくと なんらかの原因でプレファブがアサインされなかった場合にエラーがでて停止することがありません。Instansiateにnull(空文字=なにもありません)が指定されるとUnityの実行が停止してしまうので気をつけてください。 

衝突判定からあるオブジェクトを除外する場合には

var bulletPrefab : Transform;
function Start () {
var bullet = Instantiate(bulletPrefab) as Transform;
Physics.IgnoreCollision(bullet.collider, collider);
}


リファレンスの例ですが bulletPrefab(弾のプレファブ)を 『Physics.IgnoreCollision(bullet.collider, オブジェクト名.Collider)』オブジェクト名のCollider との計算から省きます。

注) 『as Transform』は Transform型として定義 という指定です。

例えば弾を発射する自分自身に弾が当たらないように計算から除外するなどという使い方です。
1対他(オブジェクト対レイヤー)のような使い方はできないようですが、レイヤー同士の衝突の場合には
Physics.IgnoreLayerCollision(1つ目のレイヤーナンバー,2つ目のレイヤーナンバー,true);
の形で対処できるようです trueをfalseにすればレイヤー同士の衝突判定がおこなわれます。
Ignoreの宣言はゲーム開始で一度呼ばれればいいので Start()関数内で行ってください。


OnTriggerEnter() にはOnTriggerStay()とOnTriggerExit()という仲間があります。
OnTriggerEnter() はトリガーと衝突した瞬間に判定が発生します。
OnTriggerStay()  はトリガーに触れている間判定が出続けます。例えばトリガー内部に入っている間スピードがあがるなどといった使い方です。
OnTriggerExit()  は接触していたトリガーと離れた瞬間に判定が出ます。

■OnCollisionEnter()

トリガーと使用法は似ているのですが 返ってくる値がCollisionInfoな点が違います。
接触したポイント座標や法線がcollision.contacts[0]、collision.contacts[0].normalに
返ります。またcollision.gameObjectで衝突したコリジョンをもつオブジェクトのデータを参照することもできます。Triggerの場合返ってくるのはCollision.Collider だけです。
OnCollisionEnterの場合は
relativeVelocity, rigidbody, collider, transform, gameObject, contacts などの値が返ります。

var explosionPrefab : Transform;

function OnCollisionEnter(collision : Collision) {

var contact : ContactPoint = collision.contacts[0];
var rot : Quaternion = Quaternion.FromToRotation(Vector3.up, contact.normal);
var pos : Vector3 = contact.point;
Instantiate(explosionPrefab, pos, rot);

Destroy (gameObject);
}

これもリファレンスの例からです。 これは衝突したコリジョンの衝突位置と法線の回転方向をとってきてexplosion(爆発のプレファブ)を衝突位置に衝突方向に回転させてInstansiateさせています。

OnTrigger同様に OnCollisionStay()、OnCollisionExit()という仲間があります。


■Physics.Raycast()
ある方向にオブジェクトからRay(英語では光線 )を発射するイメージです。
レーザーサイトのような感じで交差する点からオブジェクトと交点の情報を返します。

var hit : RaycastHit;
if (Physics.Raycast (origin, direction, hit,
distance,layerMask)) {
var distanceToGround = hit.distance;
}


の形で扱うのが基本です。
originはRayを発生するオブジェクト座標 大体は transform.position
directionはRayを発生する方向 Vector3.upなら絶対座標の上(オブジェクトの上ではなくワールド座標の上方向でオブジェクトの上方向を指定するならtransform.upになる)

Vector3クラスの値は以下のとおり
zero    Shorthand for writing Vector3(0, 0, 0)
one    Shorthand for writing Vector3(1, 1, 1)
forward Shorthand for writing Vector3(0, 0, 1)
up    Shorthand for writing Vector3(0, 1, 0)
right    Shorthand for writing Vector3(1, 0, 0) 

forwardは正面ですが後面の場合-forwardと書きます 値は(0,0.-1)
hitはhitInfoです。Rayが当たったオブジェクトからの情報が帰ってきます。
この例の場合戻り値は指定した変数hitに帰ってきて
hit.point  Rayが当たった座標
hit.normal  Rayが当たった法線座標ベクターつまり面の角度
hit.distance Rayの当たった場所までの距離
hit.collider Rayの当たったコリジョン情報。通常hit.collider.gameObject.tagを指定して
例えば
if (hit.collider.gameObject.tag=="BG"){〜}などのようにタグが”BG”なら〜するという処理を記述します。

distance Rayを跳ばす距離です(float型) 。Mathf.Infinityを指定すれば無限。

layerMask  レイヤー番号に従ってRayのヒット判定を検出するオブジェクトを指定します。  少しややこしいのは32ビットのマスクを作成するところで

例えば 1<<9 とすると9番のレイヤーを指定したことになります。<< はビットシフト演算子と呼ばれるもので 2値だと 000000001 がシフトされて100000000 となり9番目のビットが立つイメージでしょうか。9番以外全部を指定する場合は~(1<<9)  ~は除外の演算子です。 複数のビットを立てたいときは(1<<9)||(1<<10)などのように||(or演算子)を使用してください。


fig9


衝突した相手オブジェクトにダメージを与える



OnTriggerEnter()文中でHitしたオブジェクトのCollider情報が検出できるわけです。

var damage:int=100;

function OnTriggerEnter( otherObject: Collider ){
  if(otherObject.gameObject.tag=="Enemy"){

var enemyStatus:enemyDamage = otherObject.GetComponent(enemyDamage);
enemyStatus.ApplyDamage(damage);

}


という手続きを簡略化したものがSendMessageで『講座みたいなもの一回目』でやりましたが

var damage:int=100;

function OnTriggerEnter( otherObject: Collider ){
  if(otherObject.gameObject.tag=="Enemy"){
otherObject.SendMessage ("ApplyDamage", damage);

}

2つの例は同じ動作をしていますがSendMessageをつかうとと少しだけ短いスクリプトで書けます。
あと衝突した相手オブジェクトのスクリプトを調べる必要がありません。




オブジェクト(弾)の移動
サンプルプロジェクトのenemyBulletScript.js の一部ですが

function Start(){

target= GameObject.Find("player").transform;
//ターゲットを探すこの場合はプレイヤーのトランスフォーム(位置座標)
}

function Update () {

if((aimingTimer <= aimingTime )&&(AimingActive==true)){
  //aimingTimer が 一定時間(aimingTime)より小さければ transform.LookAt()関数を使用してプレイヤーの座標に自オブジェクトの先頭を向ける        
transform.LookAt(target);

}

switch( projectType){


case 0:
transform.Translate(Vector3.forward * bulletSpeed * Time.deltaTime);
// transform.Translate(方向ベクター * 弾の速度 *1フレーム当たりの時間)
     break;


case 1:
.........................
case 2:
.........................
case 3:
.........................
case 4:
.........................

}
if(destroyTime!=0){
Destroy(gameObject,destroyTime);
   //destroyTimeが設定されていれば destroyTime秒後に自オブジェクトを破壊する。
     //destroyTimeはfloat型
     }


aimingTimer += Time.deltaTime;
// aimingTimerを1フレーム分加算する
}


}



というところで弾の解説をひととおりしました。ブログの文字数制限などもありますので一旦これでおわりにしてホーミングミサイルなどの話は弾の表示関係のオブジェクトなどがはいったときに一緒に解説しますね あとオブジェクトの移動に関してはエネミーの回で解説でしましょう。


今日はもう一回 日記を更新しますよ(Unity記事じゃないです)

■追記です 8月23日
shinriyoさんから指摘がありました 一部の漢字の間違い(値が帰る => 返る)と
enemyBulletScript.js これはエネミーにアサインするスクリプトです。サンプルプロジェクトをダウンロードした方は理解できると思って手を抜いてしまいました 申し訳ありません。

akinow at 17:46|PermalinkComments(7)TrackBack(0) Clip to Evernote Unity3d | シリーズ講座