Yaminabe

らくがきぶろぐ

てすと:Yaminabeちゃんは生まれたばかりのブログです みんなで仲よく使ってね

カテゴリ: Unity3d

こんにちは ぶぎょう17です。
17はなんですかって? 直樹三十五みたいに『名前+年齢』を気取ってみているわけですよw
本当に17歳かなんて詮索はしないように 悲しくなりますから。。。 

あと なんだか過去記事に直リンされてるみたいなので一応言っておきますよ
コンシューマーのお話は来ているけどまだ動いてません 作業は夏以降予定でタイトルも決まってないです。そしていま仕事のメインは携帯やパチンコです いちおうね。(この記事も一定期間過ぎたらなくなります)


■海外のセンスは日本と違いすぎて理解出来ないという声を聞きます。

わたしはファンタジーというのは 日本でいうと時代劇にとても良く似ていると思うのです。
という話を以前していたところ『時代劇は本当にあったことだから違うだろ』という反論がありましたが、時代劇なんて現代人が、かっこ良く脚色した嘘っぱちですよ あれを信じちゃってますか?
江戸は関西弁が主だったし 歩くときには右足と右手が一緒に出るとか 既婚者はお歯黒だし
刀はすぐ切れなくなるから突いて使うのがメイン ならず者が帯刀してるとか当時ではありえない
斬り合いの際刀の刃で攻撃を受けた場合折れる場合がある。
つまりチャンバラのような派手な斬り合い(殺陣)すらあったものか と考えられています。
要するに ある程度実際にあった史実をベースにしてそこの後世の人間たちがかっこよく脚色したわけです。

ファンタジーは西洋の昔の話を後世の人間が脚色して創作したという点に関しては 成り立ちは時代劇や西部劇と変わるところはなくて やはりつくり話なんですけども って言うのは説明しなくてもわかりますよね。 ドラゴンや派手な魔法が本当にあったと考えている人はいないでしょう。そこらへんの成立過程がとても似ているんではと考えました。

そしてファンタジーは西洋の文化に根ざしたところから出ているため やはり外してはいけないポイントというのがあると思うのですよ。
で 日本のRPG JRPGはファンタジーRPGを基本にしているわけですが、 えー 本文来ましたよw

例えばファイナルなんとかではファンタジーをSFなどと融合させてカッコイーと言っています
ところが海外では日本のファンタジーRPGであるエフエフは受けが良くない
さらに外人たちはなんでこのかっこ良さがわからないんだと 日本人側からすればそういう論調ですよね。

そこで これをみてください



as-afro1as-ninja-ninja1as-brother-one


『アフロサムライ』 日本のアニメ初のエミー賞も受賞した本作。

時代劇を西洋風に解釈してSF風味の味付けをしました。これ作家は日本人で外人のもつ おかしな日本観を想定して
つくられたものです。海外市場を?狙って作った作品なんですよね。で海外ではとてもうけたわけです。

『エフエフはそんなのじゃねえ もっとかっこいい』と言うかもしれませんけど 西洋外国の方たちもこれを
大真面目にかっこいいと思っているわけです。 これが日本でもヒットできると思いますか?というおはなし。

で 結果的にこの『アフロサムライ』は日本ではさっぱりだったわけなんですけど。

ジョージ・ルーカスは黒澤明の『7人の侍』にインスピレーションを受けて『スターウォーズ』のライトセーバーの剣劇をつくったそうです。これはもちろん世界的に大ヒットしました。
時代劇をお手本にしても 世界的ヒットは出る この違いはなんでしょうか?

わたしは『置き換え』と『付け加え』の差だと思います。

すでにファンタジーという完成されたものがあり長い間浸透してきた そのなかにSFという異物を付け加えたわけですから。 カレーとラーメンが両方美味しいからラーメンカレーをつくるという発想です。
ファンタジーでありつつその時代にそぐわないメカも同時に楽しむという意味でです。
スターウォーズの場合は構造を時代劇に模倣しつつSFとして昇華しています。これは日本の太巻きを材料とアレンジを変えてカリフォルニアロールを作ることに近いと思います。
少し乱暴ですけども 一部の嗜好にしか合わなくなってしまうのはここらへんが要因になっている気がします。

ぱくる(参考にする)時はバランスをそのままに要素を変換すると発祥の人たちの口にも合うことがあるよ。 
新要素を合成すると完成されたバランスが崩れて 一部の人間しか食べれないものができるヨ ということです。

もちろん目的としては売上につながれば達成されているので どちらが優れているわけではありません が
なぜ 一部で人気のものが全体では理解されないかという 1つの考え方としてとらえてくださいませ。

ただし 同じように海外で受けの悪いドラクエタイプはちょっと違った法則が働きます それは叉の機会に・・

 
あと最近の例で 例えば『東方プロジェクト』という大ヒットの同人文化がありますが、要素がとても似ているものがあって それが『クトゥルー神話体系』。怪物に非常に細かい設定をした上でベースとなる話を簡単に付けるというもの。 実は著者のラブクラフト自身による作品は極少数です。 それを草の根作家たちが様々なストーリーに二次創作するといった部分ですね。 話の核となる『ネクロノミコン』なんかはもう世界的に有名ですけど これも実態のなかった中身が、様々な後世の作家たちに創作されて言ったものです(まあ今も実態があるかは謎ですが) 
錬られた大量の設定と怪物の存在を匂わせるだけのストーリーが、
いま風に言うと中二病的な 裏設定大好きな若い人のココロを ずッキュン とやってしまうわけですねw


え なんですか サムライチャンプルー?そんなの知りません。


追記:ほんとうはもっと文章が長くていろいろと例を上げていたのですけど まとまりがなくなったので
要素だけを抜粋しました 急展開に論じて ごめんなさい。


■ストパンSTG制作の進捗
1月初頭に描いたキャラクターセレクト用線画を塗ったのにアップを忘れていまいした。
芳佳をのぞく塗りにかかった時間は2日半です。 そして芳佳も塗りなおしました だって田舎臭かったんだもんw

キャラの絵を描いたのはハイモデルの作り込みをしている時間がなさそうだったのと 2人以上で遊べるようにしたいかも という布石です。いまのモデル表示でキャラクタを選ばせるタイプだと負荷がかかって表示が無理っぽいのでテクスチャにしてみました。派手さも上がるし やっぱりシュミレータじゃなくてジャパニーズのキャラクタゲームの様式ってのを踏襲したほうが外人サンにも日本を意識してもらえるし馴染みがいいんじゃないかという考えです。まあハイモデルはつくって作れなくもないんですけどセレクトと演出ちょっとのために作るには効率が悪いですよね それでゲームがものすごく面白くなるわけではないので。 だからもしこれが完成して続編が出るとしたら
トゥーンシェードでハイモデルつくりますよ。。。。たぶんw

わたしの場合はリソース(材料)ができるとモチベーションが上がって 動き出すタイプなので
とにかく最初に絵とモデルはつくってしまいます。 絵柄なんかは作る間にもどんどん変わっていくのが普通なので
眺めている間に新しくやりたい部分が見えてきたり手を入れたりしてどんどん良くしていきます。それじゃないと
絵作りとか無理だからさ。
よくソフト屋さんで一発で修正が出ない絵を入れさせたがる人がいますが、そんなのはバグ無しソースを一発提出するぐらいの離れ業ですからw 少なくとも私にはできません。

クリックすると少し大きくなりますよ

all_character_preview

お待たせしました Unityばなしです。
検索で多いセーブロード関連についてすこし

Unityエンジンでよく使うだろうものをピックアップしました。




■Fileに直接書きこむ

Save and Load from XML

http://www.unifycommunity.com/wiki/index.php?title=Save_and_Load_from_XML

WikiのXml形式でのセーブロードスクリプトです。

http://answers.unity3d.com/questions/971/how-to-scrip-a-save-load-game-option

UnityAnswerにも回答が載っています



■PlayerPrefs

http://unity3d.com/support/documentation/ScriptReference/PlayerPrefs.html
リファレンスから抜粋しました

スタンドアローン
           Macの場合 ~/Library/Preferences
           Windowsの場合 レジストリキー HKCUSoftware[company name][product name]

Webプレーヤー     Macの場合 ~/Library/Preferences/Unity/WebPlayerPrefs
           Windowsの場合 %APPDATA%UnityWebPlayerPrefs

にそれぞれデータが格納されます。

使用法(Int:整数値の場合)

PlayerPrefs.SetInt("Player Score", 10);

PlayerPrefs.GetInt("Player Score");

ハイスコアなどを一時的に格納する用途があるようです。ファイルは閲覧されてしまうのでゲームに重要なデータを
おくと書き換えられてしまいます。 


■ArrayPrefs
Player

http://www.unifycommunity.com/wiki/index.php?title=ArrayPrefs


■Application.LoadLevel

ステージデータを一面分読み込みます。
インデックスを使用して
 Application.LoadLevel (0);
またはシーンの名前を直接指定して
 Application.LoadLevel ("Stage1");
のように使用します。

インデックスはUnityエディタのFile >BuildSettingを使用時にシーンごとの左肩につく数字です。

現在のシーンにシーンデータを追加で読む場合には 
Application.LoadLevelAdditive
を使用します。

シーンをプレイしながら裏で別のステージを読み込みたいシームレスなワールドを作りたい時などに
Application.LoadLevelAsync
Application.LoadLevelAdditiveAsync

という関数も用意されています 使用法はApplication.LoadLevelと同様ですがプロバージョンでしかつかえません。



■TextAsset
ステージの座標データなどを記述したTXT形式ファイルの場合TextAssetタイプの記述で
読み込むことが可能。
以下は公開中の60ラインパックマンからステージを作成する箇所をお借りしました。

var mapAsset : TextAsset;
var blockPrefab : Transform;
var pelletPrefab : Transform;
var superPrefab : Transform;

function Awake () {
var map = mapAsset.text.Split ("
"[0]);
var v = new Vector3 ();
v.y = 1.0;
var j_off = map.length / 2.0;
for (var j = 0; j < map.length; j ++) {
v.z = (map.length - j - j_off - 1) * 2;
var i_off = map[j].length / 2.0;
for (var i = 0; i < map[j].length; i ++) {
v.x = (i - i_off) * 2 + 1;
if (map[j][i] == "X") {
var inst = Instantiate (blockPrefab, v, Quaternion.identity);
inst.transform.parent = transform;
} else if (map[j][i] == ".") {
Instantiate (pelletPrefab, v, Quaternion.identity);
} else if (map[j][i] == "O") {
Instantiate (superPrefab, v, Quaternion.identity);
}
}
}
}


TextAssetタイプを指定したmapAssetから 変数mapに1ワードづつ切りだして if文で文字の種類ごとに
処理をしています。
例えばシューティングゲームの敵のスクリプト処理などはこれをつかえば作り易いかと思います。


■Resources.Load

リソースクラスのロードだけですが、外部のファイルを取り込むことが出来ます。
テクスチャやサウンドを入れ替えることができます。


function Start () {
var instance : GameObject = Instantiate(Resources.Load("prefab", GameObject));
}



パスを指定する場合は  Resources.LoadAssetAtPath を使用して

prefab = Resources.LoadAssetAtPath("Assets/Artwork/〇〇.fbx", GameObject);

のように直接指定。

これでMODのようなことができるのか検証していないのでわかりませんが、おそらく
自作モデルやテクスチャ、サウンドデータを設定しておけば読み込みが可能だと… 



リファレンスをみればほとんどわかることなので、Unityエンジンのサイトからとべる
リファレンスとWikiを活用することをおすすめします。

なにか 絵がないと寂しいのでスーパープレイ動画とやらを載せておきますw





クリスマス・・去年倒したはずなのに 。
日本の欝ソングって言えばこの『クゥリスマスが今年もやあてくルゥー』とサザエさんのEDだと思われるのですが。
サザエさんのエンディングは会社をやめて何年も経つのに、聞くたびにモリモリと力が抜ける魔性のソングだし。
くぅーりすます の方は言わずもがな世の中のリア充をのろってしまうそんな定番ソングであるわけです。
あと5月5日にフルーツバスケットのOPなんかが流れてくるのも ちょっぴり悲しく欝になる そんな感じ。
それと 仕事の締切が迫ると必ず見る夢があって、それは大学で1教科単位を落として進級できないという夢。
いつか忘れるんじゃないかと思っていたんだけど 最近いきつけの歯医者にはなしをしたら『ぶぎょうさんも
見るんだー 僕もね未だにテストが白紙で進級できない夢見るんだよ すごいプレッシャーなんだろうねw』
てな話をされた。歯医者はもうすぐ70才 えー また欝になったよ・・・




忘れた頃にはじめる スクリプト話
『Unity3D+AI』で検索をかける方がおおいようなので 少し話をしてみます

一般的にゲームに使用されるのは 移動、攻撃、回避 などの思考ルーチンをセットにしたもの
移動は ランダムな移動 と 定点への移動(パトロール) があります。


■ランダム移動

transform.position = Random.insideUnitSphere * 5.0;


を使用します。球面のランダムなポイントを返してくる関数で、半径を掛けて使用しましょう。この場合は5.0が半径です。
2次元座標に使用する場合は transform.position.z = 0;などを実行して球の高さ方向の値を
0としてしてしまえば良いと思います。

単に2次元で方向をもとめるだけならば Random.insideUnitCircle を使用して

      var position : Vector2 = Random.insideUnitCircle * 5;

と半径5の円上のポジションをもとめるやり方もあります。


また 地面上のあるポイントを算出したい場合 キャラクターコントローラーがあれば地面上をあるかせることは非常に簡単になるので

function Update () {
var hit : RaycastHit;
if (Physics.Raycast (transform.position, -Vector3.up, hit)) {
var PointOnGround = hit.point;
}
}

などとして ポジション値を返してやることで、地形上のランダム移動は可能だと思います。
レイキャストでどのような値が帰ってくるかは RaycastHit型のリファレンスを見てください。  

■ウェイポイント法

レベルマップ上にウェイポイント=決まったポジションを定義してそれらをつなぐライン上を移動させる方法です。
UnityAnswer(Unityの質問掲示板)に簡単なウェイポイントのスクリプトがあったので解説しますね。




var waypoint : Transform[];
    /// 型宣言に[]をつけてで配列型を宣言します ///


static var speed : float = 5;
private var currentWaypoint : int;
private var TurningSpeed : float = 15;
       

function Update ()
{
if(currentWaypoint < waypoint.length)
    //// 〇〇.length で配列の大きさが帰ってきます //// 

{
var target : Vector3 = waypoint[currentWaypoint].position;
    ///Vector3型 (x,y,z)の形のベクトルデータを指定 ///
           
var moveDirection : Vector3 = target - transform.position;
    /// モデルの動く方向   ///
var velocity = rigidbody.velocity;
    

if(moveDirection.magnitude < 1)
    /// Vector3.magnitudeで距離を計算 ///   
    
{
currentWaypoint++;
    /// ウェイポイントまでの距離が1以下ならば現在のウェイポイントのナンバーをひとつ進める
       (距離が1より小さい場合は計算から除外する)/// 

}
else
{  
velocity = moveDirection.normalized*speed;
    ///方向を正規化したもの(方向だけだとベクトルに大きさがあるため)に
     スピード値をかけてvelocity(速度)を計算する///   
 
     
}
}

rigidbody.velocity = velocity;
  /// verocity(速度)でrigidbody.velocity(このスクリプトをつけたモデルの速度値を更新///


   

  /////////////////////////////////////////////////////
var lookAt = waypoint[currentWaypoint].position - transform.position;
  lookAt.y = 0;
var rotation = Quaternion.LookRotation(lookAt);//target.position - transform.position
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime *TurningSpeed);
  /////////////////////////// 一定時間でQuaternion.Slerp()を使用;モデルをウェイポイントの方向に向かせる ////
               

}





  var lookAt = waypoint[currentWaypoint].position - transform.position;
  lookAt.y = 0;
var rotation = Quaternion.LookRotation(lookAt);//target.position - transform.position
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime *TurningSpeed);


この行は
  
  transform.LookAt(waypoint[currentWaypoint].position);
  transform.Rotate(transform.rotation.x, 0, transform.rotation.z);


こう書いてもいいです。

このスクリプトは基本平面を自由に動きまわるタイプFPSなどを想定しているようです。
コレ以外にも例えばレースゲームなども似た感じのスクリプトで動作できます例えば コース上に最速ラインのポイントをいくつか設定し配列に格納して順番に読み出しアザーカーがそれを目指すように実行します。
このときウェイポイントはゲーム中の最速タイムをだしたラインをレコードして使用するなどとすれば学習の効果が現れます。
自分の関わったゲームだとレコードされたラインを複数持ちランダムにポイントを選択していました。

このほかにグリッドを使用して最短経路をもとめるA*(エースター)などの方法があるので
調べてみてください。

関連して移動のための判断材料として点数を付ける方法があります。
新しく移動する位置の候補を選び出して、その場所について 敵に攻撃が通るか、立ち状態で攻撃できるか、座り状態で攻撃可能か、
相手からの攻撃エリアにはいっていないか などにそれぞれ点数をつけて得点の高い場所を有効として移動目標にする方法です。
将棋などの思考ルーチンもこうした計算がベースになっているようですので 応用範囲は広い気がします。


■攻撃について

相手が見える位置にいる→攻撃できる→距離が有効→角度が有効(視野角に入っている)などの簡単なチェックを
行います。


/////////////////////////////////////距離を求めます
var target : Transform;
if (other) {
var dist = Vector3.Distance(target.position, transform.position);


   if (dist < 100.0)
    実行文・・・・

}



/////////////////////////////////////敵の方向と自分の向いている方向との角度を求めます


var targetDir = target.position - transform.position;
var forward = transform.forward;
var angle = Vector3.Angle(targetDir, forward);
 

    if (angle < 5.0)
    実行文・・・・

}


のように 距離と角度を求めて攻撃の判定を出すかどうかを決定します。
敵との距離に応じて使用武器を変化するなどとすればさらにプレイに緩急がつくでしょう。

ちなみに距離は

var sqrLen = (other.position - transform.position).sqrMagnitude;

でももとめることが出来ます。数式で書くと√(x*x+y*y+z*z) になる わけですが Vector3.magnitude を使うより実行が速いと
リファレンスに書いてあるんですがこれほんとなのかな?


そしておおまかに ファジー関数を用いてこれらの決定に重み付けをしたりニューラルネットで学習を施すなどの味付けをするなどと
すればより賢いスクリプトが仕上がってくるはず?

特に決まりはないのでじぶんの思いついたやり方でそれっぽくなれば、おっけーというぐらいで
あまりやりすぎてもゲーム自体が重くなってしまうので注意したほうがいいでしょうね。

相手に攻撃が通るかは 前述したレイを飛ばす方法でコリジョンヒットしたら攻撃は通らないということです。


ウェイポイントによる移動はFPSのチュートリアルの人間型敵の移動を、
ランダムな移動はUnityのTPSのチュートリアルの空をとぶボール型の敵を参考にすればいいかと思います。
あとロコモーションシステムについてくる自由移動のスクリプトも見ておきましょう。
詳しい説明は もう少し勉強が進んだら時間のあるときにやります。 たぶんw

ちょっと閑話休題
わたしがメーカ内にいたときに見た思考プログラムはif分の塊で 高度なものを期待している人はちょっと肩透かしな気になるかもしれません。
理由は幾つかあって 
○グループで製作されるため誰でも見通しのよい読みやすいものにすること。
○引継ぎしやすさも考えて並易に書くこと。 
○動けば良い。
などの理由があったようです。
洗練されたスクリプトを書くと自分自身があとで理解不能になったりしますよねw なので自分の書きたいように書いてかまわない
けど表現の簡単なものをと教えられました。
あと 『コピペ推奨』と『書いたものは消さない』というのも教えられましたね。
同じ物をかくのにコピペを禁止したりすることがあるようですけど 時間がかかる上にバグのもとになりやすいです。
一度書いたものはコメントラインで残しておくと再編集が容易になるし思考の流れが記録されます。

はー長くなってしまった 今後の予定として ブログの方はきちんと講座形式でやりたいんですが(私のつたない知識では物足りないと思いますけど) ストパンstgの方も計画が遅れまくっているので気長にやっていきますよ ええ。 春まで仕事が山積していて予定通りにはいかないと思いますが
あてにしないで待っていてください いや そのうちUnityのいい本がでるはず みんなそれを買ってw。

追記: すっごく中途半端な記事になってしまったので、おすすめリンクを載っけときます。

      http://www-cs-students.stanford.edu/~amitp/gameprog.html






 

hanseibun_thumb

こんばんは 作業が山を迎えようとしていて 体力がかなり落ちてます。

 画像ですけどスカートが短いことに反省文を書かされた女子高生が文末にメッセージを忍ばせたらしいです。
文章のおしりをタテに読んでいくと『はん世いは指ない(はんせいはしない)』となってるわけですね
やるなJK アタマ字に比べて難度の高いおしりの文字を使うとは。
まあ いろは唄のように文字数が決まっていないのでいくらか難易度は下がるといえども限られた時間で
これをやったのは 不謹慎だけどなかなかいい仕事ですw

ほかにもこんなのがあるそうですよ と画像を貼っておきます。

lib315828

uproda170432

washigasodateta


脈絡もないですが むせぶ。。。
seiup-nandemo_1290513094097
続きを読む

101115


トップ絵の更新をしようと思ったんですけど 力尽きました。
ARとパチンコの案件を終わらせて休みが取れると思ったんですけど 来週から箱のゲーム背景をつくることになってるらしいです とりあえず寝かせて。。

最近聞いた話でこのようなサイト↓が出来て ゲーム会社の中の人達の間でちょっと問題になっているらしいです。

http://www13.atwiki.jp/game_staff/

各ゲーム会社のゲームクリエータがどのゲームを製作したかの詳細 といってもスタッフロールや噂からの類推らしいですけど
が まとめられています。
離職率の激しいゲーム業界では一部署のにつとめた人間は数年間で数百人規模になるので部署ごとに十数人程度記載されたところで全容というわけにはいかないと思いますが、のちのち内容が充実してきたらある程度使えるデータになるかもしれません。

ただし人事などに見られるとちょっと厄介かも というのもクリエイタ個人がなにを製作したかというのは
各部署レベルでしか把握していないため だれもがひっそりと開発を続けられたわけですが
こういうデータがまとめられたことで今後個々の開発者を測るモノサシに使われる可能性があるということです。

在籍中ヒットに絡んだ人はいいのですが、代表作がマイナー作品で占められているような人も稀にいますので
というかヒットなんてそう出るものではないので、そういう人がほとんどですけど そうした人が人員整理の対象になるんではないかという危惧があります。業界内で転職する場合にもこれを参考にされるといろいろと不味そうです。

隠れたヒットメーカーを見つけ出すとか
知り合いの誰がどこに就職しているなんていう追跡にはいいのですけどね

ちなみに私の名前はなかったですよw


続きを読む

↑このページのトップヘ