昔好きだったゲームをちょっと真似して作って行ってみよう。
知ってる人は知っていると思います。
Quintyというゲーム
quinty wikipedia
unityで勉強がてら真似してみようと思います。
クインティを3D化しよう!
今回の目標
- playerを作る
- 3Dで作る。
- playerの位置に応じて床をクルクル回す。
壁フィールドを生成する。
3D ObjectのCubeを駆使して力技で配置しただけです。
ただ、床のマスを配置するときのObject名は、
縦何個目、横何個目なのかがわかるようにしておきました。
101の場合は、縦1、横1
301の場合は、縦3、横1
プレイヤーを作る
かなり手抜きですが、精一杯作ってます
playerを作る時は、一番上のレベルにplayerという空のobjectを作成し、
その下に追加するようにしておきます。
⇩こんなイメージ
そうすることで、playerに対して、回転処理などを行った場合
全部のオブジェクトがいい感じに追従して回ってくれます。
playerにつけるスクリプト
移動スクリプト
walkSpeedなんかは適当に設定しておいてください。
前半は、[.]を押した時に、現在位置と向きから
めくる対象となるオブジェクト位置の計算を行い、
対象オブジェクトに床の回転指示を与える処理です。
後半は、方向に応じて、向きを変えて、その方向に等速で進む処理です。
function Update () {
// パネルめくり
if (Input.GetKeyUp(".")) {
// 向きに応じて、めくりパネルを選択
if( transform.localRotation == Quaternion.Euler(0, 180, 0)){
// 縦方向は 四捨五入で整数 1桁目
// 横方向は 少数以下切り捨て で対象オブジェクトになる。 3桁目
var x = Mathf.RoundToInt(transform.localPosition.x);
var z = Mathf.FloorToInt(transform.localPosition.z);
var dic = "Left";
}
else if( transform.localRotation == Quaternion.Euler(0, 90, 0)){
z = Mathf.RoundToInt(transform.localPosition.z);
x = Mathf.FloorToInt(transform.localPosition.x)+1;
dic = "Down";
}
else if( transform.localRotation == Quaternion.Euler(0, 270, 0)){
z = Mathf.RoundToInt(transform.localPosition.z);
x = Mathf.FloorToInt(transform.localPosition.x);
dic = "Up";
}
else if( transform.localRotation == Quaternion.Euler(0, 0, 0)){
// 右向きの場合
// 縦方向は 四捨五入で整数 1桁目
// 横方向は 少数以下切り捨て+1 で対象オブジェクトになる。 3桁目
x = Mathf.RoundToInt(transform.localPosition.x);
z = Mathf.FloorToInt(transform.localPosition.z)+1;
dic = "Right";
}
var objeName = x + "0" + z;
var obj:GameObject = GameObject.Find("Field/"+objeName);
if(obj){
// 各オブジェクトにsendMessage
obj.SendMessage(dic);
}
}
// 方向転換 移動
else if (Input.GetKey(KeyCode.LeftArrow)) {
transform.localPosition.z = transform.localPosition.z - walkSpeed;
transform.localRotation = Quaternion.Euler(0, 180, 0);
}
else if (Input.GetKey(KeyCode.DownArrow)) {
transform.localPosition.x = transform.localPosition.x + walkSpeed;
transform.localRotation = Quaternion.Euler(0, 90, 0);
}
else if (Input.GetKey(KeyCode.UpArrow)) {
transform.localPosition.x = transform.localPosition.x - walkSpeed;
transform.localRotation = Quaternion.Euler(0, 270, 0);
}
else if (Input.GetKey(KeyCode.RightArrow)) {
transform.localPosition.z = transform.localPosition.z + walkSpeed;
transform.localRotation = Quaternion.Euler(0, 0, 0);
}
}
床オブジェクトのスクリプト
Updateの中で、回転メッセージを受信した時にだけ、
一定速度でcubeを回転させます。
if( transform.rotation == toRot )の処理で、
対象cubeの回転が完了した時の処理を行います。
今回は、回転角度のオーバーフローが心配だったので、
回転が終了したら、回転角度を0に戻しておきました。
後半のfunctionはplayerControlから受信する
メッセージの受け取り口です。
function Update () {
if(LeftOn){
var toRot : Quaternion = Quaternion.Euler(-90, 0, 0);
transform.rotation = Quaternion.Slerp (transform.rotation, toRot, Time.deltaTime * 10.0);
if( transform.rotation == toRot ){
LeftOn = false;
transform.localRotation = Quaternion.Euler(0, 0, 0);
}
}
if(DownOn){
toRot = Quaternion.Euler(0, 0, -90);
transform.rotation = Quaternion.Slerp (transform.rotation, toRot, Time.deltaTime * 10.0);
if( transform.rotation == toRot ){
DownOn = false;
transform.localRotation = Quaternion.Euler(0, 0, 0);
}
}
if(UpOn){
toRot = Quaternion.Euler(0, 0, 90);
transform.rotation = Quaternion.Slerp (transform.rotation, toRot, Time.deltaTime * 10.0);
if( transform.rotation == toRot ){
UpOn = false;
transform.localRotation = Quaternion.Euler(0, 0, 0);
}
}
if(RightOn){
toRot = Quaternion.Euler(90, 0, 0);
transform.rotation = Quaternion.Slerp (transform.rotation, toRot, Time.deltaTime * 10.0);
if( transform.rotation == toRot ){
RightOn = false;
transform.localRotation = Quaternion.Euler(0, 0, 0);
}
}
}
function Left(){
Debug.Log("Left");
if(!DownOn && !UpOn && !RightOn){
LeftOn = true;
}
}
function Down(){
Debug.Log("Down");
if(!LeftOn && !UpOn && !RightOn){
DownOn = true;
}
}
function Up(){
Debug.Log("Up");
if(!LeftOn && !DownOn && !RightOn){
UpOn = true;
}
}
function Right(){
Debug.Log("Right");
if(!LeftOn && !DownOn && !UpOn){
RightOn = true;
}
}
今日はここまで。
予定
- 敵オブジェクト配置
- 敵オブジェクトをplayerを追いかけるようにする。
- 床回転時に飛んでくようにする
- 壁にぶつかったら消滅
- playerと敵の当たり判定