スクリプトの追加、キャラクターの移動


スクリプトの追加方法、
キャラクターの移動処理を作る
ゲームにおいてプログラム(スクリプト)は必要不可欠なものです。
マリオがジャンプするのもポケモンが成長するのもプログラムでできています。

Unity3DではプログラムとしてJavaScript、C#、Boo Scriptが使用できます。
得意な言語を選択できるだけでなく、複数の言語を混在させゲームを作ることができる利点があります。
例えば誰かの書いたC#のスクリプトを利用したプログラムをJavaScriptで書くとか…

このサイトではJavaScriptに絞って解説をしてこうと思います。
JavaScriptはHTMLでもつかえる言語ですので知っている方もいるかも知れません、
文法的にもウェブで使うものとほとんど一緒です。文法的にわからない部分が出た場合ウェブで使うJavaScriptの解説を見てもいいかもしれません。

(当サイトでは基本的なプログラムの知識がある方を対象として、Unity3D特有の処理部分について記事を書いていこうと考えています)

今回作成するものはこんなの↓を作って行きたいと思います。



方向キーで移動できます。それだけです、解説のためにシンプルな設計にしました。
細かい機能(あたり判定など)の追加は後々の記事で解説していこうと思います。

準備



スクリプトを作成する前にプレイヤーを作りましょう。
Cubeを作成してください。
あとDirectional lightも追加しておきましょう。
カメラをCubeが映る場所へ移動して準備完了です。

基本的な操作は別の記事ゲームオブジェクトの作成に記載しましたのでここまでの操作がわからない場合に参考にしてください。


再生するとこんな感じになるようにしておきましょう。
chara1.jpg


スクリプトの作成


ではスクリプトを追加しましょう。

Projectパネルを右クリックし「Create → Javascript」を選択してください。
すると「NewBehaviourScript」が作成されますので、「Player」という名前に変更しておきましょう。

chara2.jpg

追記:
当記事で説明に使っている画像はUnity3.5のものです。
最新版のUnity4ではProjectパネルは以下の様に変更されました。
Unity4Alert.jpg
Projectパネルに新たにオブジェクトを作成する場合は右側のフォルダの中身の部分を右クリックするか左上のCreateボタンを押してオブジェクトを作成してください。


スクリプトの編集


スクリプトの編集は作成したPlayerをダブルクリックすると編集用のアプリケーションが起動し、編集することができます。

chara3.jpg

これがPlayerスクリプトの中身です。スクリプトを作成したばかりですが最低限のプログラムを最初からUnity3Dが用意してくれています。

各箇所の意味は大体↓のとおりです。
#pragma strict  //厳粛な型チェックを行う。

function Start () {
//プレイヤーの実行時に一度だけ呼ばれる
}

function Update () {
//毎フレームごとに呼ばれる
}


一行目の「#pragma strict」はこのプログラムで厳粛なチェックを行うことを宣言するものです。
この宣言により宣言されていない変数の利用をしたり、型宣言がされていない場合や型の異なる変数への代入が行われる場合にエラーが発生するようになります。

JavaScriptでは本来、変数や型の宣言や型チェックが無いのに「#pragma strict」の宣言で禁じられてしまうのか…。と思う方もいるかも知れませんが、「#pragma strict」が宣言されることにより変数や型の宣言や型チェックが実行前におこなわれるので、実行中のチェックが省略することができるためJavaScriptの実行速度が飛躍的に向上します。
「#pragma strict」は可能な限り宣言するようにしましょう。

次の「function Start ()」はこのクラスが実行される最初に1度だけ実行されます。
初期処理はここに記載しておきましょう。

次の「function Update ()」にフレーム毎の処理を記載しましょう。
今回で言えばキーボードの入力有無を判断してプレイヤーの座標を更新する処理をここに記載します。

スクリプトの編集



ではプレイヤーがキー入力に対応して動く処理を追加してみましょう。

コードはこんな感じです。
#pragma strict

var spd:float = 0.01;

function Start () {

}

function Update () {

if (Input.GetKey("right")) {
transform.position.x += spd;
}
else if (Input.GetKey("left")) {
transform.position.x -= spd;
}


if (Input.GetKey("up")) {
transform.position.z += spd;
}
else if (Input.GetKey("down")) {
transform.position.z -= spd;
}

}


最初の方で変数の宣言をしています。
functionの外側で宣言した変数はプログラム内で共有されます。
functionの内側で宣言した変数は関数内のみで有効です。ここらへんはJavaScriptと同様です。

var spd:float = 0.01;

変数の宣言は↑のように行います。
浮動小数点型のspdという変数を初期値0.01で宣言しています。

var : 変数宣言
spd : 変数名(自由)
float : 小数点型(型によって)

例えば文字列型だと↓みたいになりますね。
var spd:String = "aiueo";


Update内2行目の
if (Input.GetKey("rigth")) {

はキーボードの方向キーの右が押されているかを調べています。
入力があるならtrueが返ってきます。

Inputクラスには入力に関する処理が実装されています。
ゲームコントローラからの入力なんかも簡単に取得できるような仕組みになっています。
公式リファレンスは↓です。(英語です)
http://docs.unity3d.com/Documentation/ScriptReference/Input.html

次の行の
transform.position.x += spd;

でプレイヤーの座標を更新しています。

transformクラスはオブジェクトの座標、角度、拡大率などを管理するクラスです。
transform内のposisionに座標が保存されています。

positionはVector3クラスでx,y,zの3次元座標値を保存しています。

以降の部分についてもほとんど同じで、キーボードから他の方向の入力の有無を調べて入力されている方向に対応する座標を加算減算しています。

プログラム経験のある方は気づいたかもしれませんが、transformという変数はどこから来たのでしょうか?
実はこのプログラムは Unity側がGameObject型のクラスを継承したプログラムだと解釈します。
なので宣言していないtransformという変数をいきなり使うことができるのです。

「なにいってるのかわかんねー」って人もいるかと思いますが、そんなもんかーで大丈夫です。きっとそのうちわかります。

スクリプトの適用


作ったスクリプトはまだ、どのオブジェクトに対する処理なのかがUnityにはわかりません。
スクリプトとゲームオブジェクトをひもづけてあげましょう。

スクリプトをまず保存しましょう。
メニューから「File → Save」を選択するかCtrl+Sを押しましょう。


スクリプトの保存ができたらUnity3dの画面に戻って作業をします。
ProjectパネルのPlayerをドラッグしてHierarchyパネルのCubeにドロップしましょう。
chara4.jpg

するとCubeをクリックした時のInspectorパネルの一番下にPlayer(Script)という欄が追加されます。
chara5.jpg

これで紐付けが完了です。

早速再生ボタンを押してみましょう!

エラーについて



皆さん無事プレイヤーをキーボードで操作できましたでしょうか。
動かなかった方もいるのではないでしょうか、かくいう僕もこの記事を書いてる時に書き間違いをしていて動きませんでした。
エラーの出なかった方も後々のことを考えてわざとスクリプトの間違いをしてみましょう。

たとえばこんな間違いをしていた場合について解説していきます。
transfom.position.z -= spd; //transformの綴り間違い



スクリプトにエラーがある状態で再生ボタンを押すと↓のような画面が出ます。
chara6.jpg
プレイモードを実行する前にすべてのエラーが直ってないとダメだぜ!ってことですね。

エラーの内容はコンソールパネルに表示されています。
コンソールパネルはメニューから「Window → Console」を選択することで表示できます。
chara7.jpg

コンソールパネルはエラー以外にもワーニングが表示されたり、自分で文字を表示させることもできます。

コンソールパネルは↓です。
chara8.jpg

上の方にボタンの意味は
Clear : エラー・ログを消す(コンパイルエラーは押しても消えません)
Collapse : 同じログを省略する
Clear on play : 実行する前にログを消す
Error pause : エラーがあった場合にプレイモードを一時停止する。
Open Editor Log : ログがメモ帳形式で表示されます。(クリアーしたログなども記録されています)

「Clear on play」と「Error pause」はONにしておくと便利です。

ボタンの欄にエラーログなどが表示されます。
上の画像のエラーは
Assets/Player.js(23,17): BCE0005: Unknown identifier: 'transfom'.

となっていますね。 謎の識別子 transfom が Player.jsの23行目17文字目にあります。という意味です。

エラーの部分をダブルクリックすると問題の行を表示してくれますので、修正しましょう。


キャラクタースピードの変更


皆様無事にプレイヤーは動きましたでしょうか?

プレイヤーは動いたけどなんか動きが遅すぎますよね?
var spd:float = 0.01;

の0.01の値を変更すればよさそうです。

0.05くらいにして再度再生ボタンを押してみてください。
でも、プレイヤーのスピードは変わらないと思います…。

実はspdの値はUnityに保存されてしまっているためUnityに保存されている値を変更してあげる必要があるのです。
Cubeを選択してInspectorパネルのPlayer(Script)の欄を確認してみてください。

chara9.jpg
スクリプト内で宣言したSpdの変数が0.01という値で保存されているのがわかりますね。
この欄の0.01をクリックして値を変更することスピードを変更することができます。


なんでこんな事になっているのかというと、このスクリプトを別のオブジェクトに使いまわした場合に、同じクラスだけど値だけを変えたいって時のための機能なのです。
例えばスピードの違う2種類の敵を1つのクラスで実現できます。

Unity側に値を保存されたくない場合には変数の宣言の前にprivateの識別子をつけましょう。今回の場合であれば
private var spd:float = 0.05;

のように記載します。


今回の解説は以上になります。

<<他の記事を読む

[スポンサードリンク]


このエントリーをはてなブックマークに追加
posted by Unity3d at 2012年07月09日16:14 | Comment(5) | スクリプト | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
プロジェクトパネルにJavaScriptを選択して名前をplayerに変えた途端消えるのですが何故でしょう?
JavaScriptが起動できないんです
Posted by S at 2013年11月19日 23:20
Unity4.3ではtextボックスの切り替えができないので、バージョンを下げるかIMEの設定を加える.dllをeditorフォルダに噛ませる必要があるようです。これでソースコードが書けるようになります。
一様link貼っときます。ttp://caitsithware.com/wordpress/?p=183
(アドレスバーにコピー&ペーストか直接入力お願いします。)
Posted by at 2014年01月04日 09:00
上のコメントは間違いでした。早とちりでした。すみません。
こちらが実装して文字入力に成功したものです。こちらも同様editorに噛ませてください。.dllでです。上のアドレスのソースは入れなくて結構です。こちらのアドレスのものです。
ttp://d.hatena.ne.jp/tiri_tomato/20130725/1374713075
Posted by at 2014年01月04日 09:29
上のふたつをコメントしたものですが、また不調でしたので色々試したところMonoDevelop.exeのプロパティで管理者モードで常に起動するとキー操作が効くようになりました。もし、これでもダメでしたら09:29の書き込みのやつを噛ましてから管理者モードの設定をしてやってみてください。ではでは。
Posted by at 2014年01月05日 14:41
Tools 画面でlanguage設定でenglish設定にしたらローマ字入力は可能です。日本語は入力中は表示されません。ローマ字にまた戻すとかな入力が現れます。検証を重ねた結果です。度々失礼します。今までのは全部間違いです。
Posted by at 2014年01月05日 16:02
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。