はじめに
ゲーム中に敵の位置を教えてくれるものを作ります。
大雑把にこんな感じ
仕様
- 矢印は目の前にある
- 敵の位置を常に指し示してくれている
#実装
準備
まずは
- プレイヤー
- 指示す先となる敵
- 矢印
- 矢印の親となるからのゲームオブジェクト
を用意します
加えて
床の追加、カメラをプレイヤーの子供にしておくと良いかもしれません
こんな感じになっていれば大丈夫です!
##コード
まずはプレイヤーを動かしたいので適当にプレイヤーが動くスクリプトを作ります
視点移動などは面倒なので書いてないですが、使いたい状況に合わせて使ってみてください!!
コピペ用としていかにコードを載せておきます
using UnityEngine;
using System.Collections;
public class PlayerScript : MonoBehaviour {
float speed = 10;
void Update () {
if (Input.GetKey("a") && Input.GetKey("w")) {
transform.position += (new Vector3 (-1, 0, 1)).normalized * Time.deltaTime * speed;
}else if (Input.GetKey("a") && Input.GetKey("s")) {
transform.position += (new Vector3 (-1, 0, -1)).normalized * Time.deltaTime * speed;
}else if (Input.GetKey("d") && Input.GetKey("w")) {
transform.position += (new Vector3 (1, 0, 1)).normalized * Time.deltaTime * speed;
}else if (Input.GetKey("d") && Input.GetKey("s")) {
transform.position += (new Vector3 (1, 0, -1)).normalized * Time.deltaTime * speed;
}else if (Input.GetKey("a")) {
transform.position += new Vector3 (-1, 0, 0) * Time.deltaTime * speed;
}else if (Input.GetKey("d")) {
transform.position += new Vector3 (1, 0, 0) * Time.deltaTime * speed;
}else if (Input.GetKey("w")) {
transform.position += new Vector3 (0, 0, 1) * Time.deltaTime * speed;
}else if (Input.GetKey("s")) {
transform.position += new Vector3 (0, 0, -1) * Time.deltaTime * speed;
}
}
}
次に矢印を動かす部分のコードです
矢印を入れるためのGameObjectを作ったのは、矢印を自分の前に常に出しておきたかったからです。
これをすることで、自分の位置 + transform.forwardを使うことでプレイヤーの向いている方向の前に出すということが簡単に実装可能です。
また、矢印は、プレイヤーと敵の位置の間の角度を所得することで、敵を追跡することが可能になるかと思います。
実際に書いたコードです。
using UnityEngine;
using System.Collections;
public class ArrowScript : MonoBehaviour {
[SerializeField] GameObject target;
[SerializeField] GameObject player;
[SerializeField] GameObject arrow;
void Update () {
transform.position =player.transform.position + player.transform.forward * 3 + Vector3.up * 0.4f;
Vector2 vec2 = new Vector2 (target.transform.position.x - player.transform.position.x,
target.transform.position.z - player.transform.position.z);
float r = Mathf.Atan2 (vec2.y, vec2.x);
float angle = Mathf.Floor(r * 360 / (2 * Mathf.PI));
arrow.transform.rotation = Quaternion.Euler(0, 90 - angle, 0);
}
}
自分の位置をプレイヤーの前にする部分は、最初の
transform.position =player.transform.position + player.transform.forward * 3 + Vector3.up * 0.4f;
になります。
transform.forward と Vector3.forwardの両方がわかっているとココらへんの処理はさくっとかけますね
つぎに、敵の方向を角度で所得する部分が残りの部分となります
ここらへんは、参考にさせていただいた記事その1,参考にさせていただいた記事その2などがとてもわかりやすい解説をしてくれているので、そちらに任せてしまおうかなと(追記で書き足すかもしれませんー
#おわりに
コード自体は短く、簡単に実装できてしまいますね
最近はハコスコ楽しいーってなってあそんでるので、そこら辺の記事も書きたいなと。。。