LoginSignup
3
8

More than 5 years have passed since last update.

[Unity]敵の位置を指し示す、矢印についてー

Last updated at Posted at 2016-08-21

はじめに

ゲーム中に敵の位置を教えてくれるものを作ります。
大雑把にこんな感じ

Untitled.gif

仕様

  • 矢印は目の前にある
  • 敵の位置を常に指し示してくれている

実装

準備

まずは
- プレイヤー
- 指示す先となる敵
- 矢印
- 矢印の親となるからのゲームオブジェクト

を用意します

加えて
床の追加、カメラをプレイヤーの子供にしておくと良いかもしれません

こんな感じになっていれば大丈夫です!

スクリーンショット 2016-08-21 16.41.34.png

コード

まずはプレイヤーを動かしたいので適当にプレイヤーが動くスクリプトを作ります
視点移動などは面倒なので書いてないですが、使いたい状況に合わせて使ってみてください!!

コピペ用としていかにコードを載せておきます

PlayerScript.cs
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を使うことでプレイヤーの向いている方向の前に出すということが簡単に実装可能です。

また、矢印は、プレイヤーと敵の位置の間の角度を所得することで、敵を追跡することが可能になるかと思います。

実際に書いたコードです。

ArrowScript.cs
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などがとてもわかりやすい解説をしてくれているので、そちらに任せてしまおうかなと(追記で書き足すかもしれませんー

おわりに

コード自体は短く、簡単に実装できてしまいますね
最近はハコスコ楽しいーってなってあそんでるので、そこら辺の記事も書きたいなと。。。

3
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
8