【Unity】ジェンガっぽいゲームを作ってみる
今回から実際にゲームを作っていきたいと思います。
とはいっても何を作るかすら思い浮かばなかったので、自宅の床においてあったジェンガをみて「あ、これでいいじゃん。」とかなり適当に決めてしまいました。
で、作るものは一応決まったのですが、どうやって動かすのか検討がつかない\(^o^)/
とりあえずそれは後で考えるとして()、まずはオブジェクト、つまりジェンガ本体の形だけ作ってしまいます。
こんな感じで 1×3×0.5 のサイズの長方形を積み上げていきます。
めちゃくちゃ時間がかかりそうに思えたのですが、Shift+左クリック+カーソルキーで複数選択 → コピー&ペースト → 座標のみ変更 を繰り返していたら案外はやく終わりました。
見やすくするためのオブジェクト名の変更に多少時間をとられてしまいましたが、
複数の名前を一度に変更する方法が分かってからは大分時間が短縮できました。
【Unity】オブジェクトの名前を一斉に変更する方法 - 現役厨房によるゲーム開発
とりあえずジェンガを動かせるようにする
マウスドラッグでジェンガが動かせるようにしたいなーってことで、
マウスドラッグでオブジェクトを動かせるサンプルを探したところ...
[Unity] マウスドラッグでオブジェクトを移動させる | HAPPY*TRAP
こちらのページにたどりつきました。
C#におけるマウスイベント、つまり「マウスが~~な時に実行する」といった条件の書き方もまとめてあり、非常に参考になりました。
サンプルは次のような内容でした。
using UnityEngine; using System.Collections; public class example : MonoBehaviour { private Vector3 screenPoint; private Vector3 offset; void OnMouseDown() { this.screenPoint = Camera.main.WorldToScreenPoint(transform.position); this.offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z)); } void OnMouseDrag() { Vector3 currentScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z); Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenPoint) + this.offset; transform.position = currentPosition; } }
サンプルの意味がよく分からなければこのページを見るといいかもしれません。
似たような内容のサンプルがより分かりやすく解説されています。
Try Unity _8 マウスドラッグでオブジェクトの移動 - BelieveInYourself
コードが完成したら、すべてのジェンガブロックに「rigidbody」コンポーネントを追加して、重力の影響を受けるようにします。
Massやdragは適当に設定してください。
サンプルコードをそのままprojectパネルに追加してそれをオブジェクトにドラッグしたところ...
なんかエラーはかれてしまいました。
google翻訳に突っ込んだところ、「クラス名とファイル名が同じか確認してねー」みたいなことを言われたことが分かりました。
確認してみたところ
public class example : MonoBehaviour {
ここの example はクラス名で、ファイル名と同じにしなくてはいけなかったみたいですね。
私はファイル名は"mousedrag.cs"にしているため、
public class mousedrag : MonoBehaviour {
に変更しておきます。
ちなみに、
using UnityEngine; using System.Collections; public class example : MonoBehaviour { //ここに内容 }
というのは定型文のようなもので、大抵の場合この中にコードを書いていくみたいです。
保存して再びオブジェクトに適用しようとすると、今度は上手くいきました!
さっそく実行してジェンガが動かせるか確認すると!
どうしてこうなった
動かせたことには動かせたのですが、暴れまわってあっというまにジェンガを崩壊させてしまいました;
今回のコードでは、「transform.position」、つまり現在地を変更して何度もワープさせるようにして動かしていたのですがこの方法だと他のオブジェクトにめりこんでしまったりします。
そこで、オブジェクト自体に速度を発生させて普通に動かしてみたいとおもいます。
オブジェクトに速度を発生させてみる
ActionScript入門Wiki - Unity - 入力によるオブジェクトの移動
上のページを参考にさせていただいたところ、
rigidbody.velocity = new Vector3(0,0,0);
こんなふうに、rigidbody.velocityを使うとオブジェクトに速度を持たせられることが分かりました。
Vector3の()内の数字が前からX、Y、Zの順に動かす方向と速さをあらわしています。
もちろんこのコードだけではマウスで動かせないので
Unityであつかわれる標準的な入力のサンプル - Neareal
こちらのページの「マウス座標の変位」の項目に載っていた、
Input.GetAxisRaw("Mouse X");
を使っていきます。
このコードは、マウスを右に動かした時は1、左に動かした時はー1、動かなかった時は0をかえすコードです。
これと先程のコードを組み合わせることで、「マウスが右に動いたときにオブジェクトを右に動かす」ことができますね!
完成したコード
using UnityEngine; using System.Collections; public class mousedrag : MonoBehaviour { //マウスをドラッグ中に実行 void OnMouseDrag() { //マウスが右に動いたときにオブジェクトをX軸の正の方向に、 //左に動いたときは逆方向に動かす。 rigidbody.velocity = new Vector3(Input.GetAxisRaw("Mouse X") * 20, 0 ,0); } }
これをオブジェクトに反映すると、そのオブジェクトを右にドラッグするとX軸方向に動きます。
ただし、Z軸方向に長いジェンガを動かす場合はX軸方向にしか動かないのでは困りますね。
その場合はこちらを使ってください。
using UnityEngine; using System.Collections; public class mousedrag2 : MonoBehaviour { //public float speed = 6.0f; void OnMouseDown() { } void OnMouseDrag() { rigidbody.velocity = new Vector3(0, 0 ,Input.GetAxisRaw("Mouse X") * 20); } }
さっきのコードの動く方向をZ軸方向にしただけのものです。
それぞれのコードをオブジェクトに適用させると...
まともに動いたー!!
不恰好ですが一応完成しました!!
今回のまとめ
- オブジェクトに速さを持たせるにはrigidbody.velocityを使う
- OnMouseDrag() {}はコードを適用したオブジェクトをドラッグしている時のみに実行することができる
- オブジェクトの移動にtransform.positionを上書きする方法を使うときは注意が必要
次回もよろしくお願いいたします。