どうも、チャーさんです。
あなたはunityで敵に近づくと、
プレイヤーを追いかけてくるという機能を
つけたいと思っていませんか?
この記事ではそれを実現するコードと方法や手順を
書いてるので読めば、敵に近づくと追いかけてくる
機能をつけれるようになります。
ということで、近づいたら追いかけてくる
をやりたい場合、読んでください。
(コードもシンプルですよ)
目次
unityで敵に近づくと追いかけてくるをやるには
ということでunityでプレイヤーが敵に近づくと
追いかけてくるようにするには、
NavMeshAgentと、
Vector3.Distance()という関数と、
if文を組み合わせれば実現できます。
あとで詳しく説明しますが、
これらで近づくと追いかけてくる機能ができる理由を
先に簡単に説明しますと、
まずunityに用意されてるNavMeshAgent
という機能を使うと、敵を自動で目的地(プレイヤー)に
向かって動かすことができます。
そして、Vector3.Distance()というこれまたunityに
用意されてる関数を使うと、オブジェクト同士の
距離を出すことができます。(floatの値で)
であとはif文を使い、
この距離が一定値以下になれば
(プレイヤーが敵に近づけば)
NavMeshAgentを稼働させ敵がプレイヤーに
向かって移動してくる(追いかけてくる)
という機能を作れます。
とはいえこれだけじゃわかりづらいと思うはずなので、
ここからは実際に動かすためのコードとコード解説を
載せます。
近づくと追いかけてくるコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class navtest : MonoBehaviour {
public GameObject goal; //これにプレイヤーを格納
public NavMeshAgent agent; //①敵が自動で動くために必要
public float distance; //②プレイヤーと敵の距離を格納する変数(distane=距離)
// Use this for initialization
void Start () {
agent = GetComponent<NavMeshAgent> (); //①
goal = GameObject.Find (“ここにプレイヤーのゲームオブジェクト名”);
}
// Update is called once per frame
void Update () {
//②二者間の距離を計算してfloat 一定値いかになれば追跡する
distance = Vector3.Distance (transform.position, goal.transform.position);
Debug.Log (distance);
if (distance < 5){
agent.destination = goal.transform.position; //①
}
}
}
コードは以上でして、このスクリプトを、
敵になるゲームオブジェクトにつければokです。
コードの説明
でここからはコードの説明に入ります。
(上記コードから説明する部分を抜粋します)
敵を動かす部分のコード
①まずスクリプトの中のNavMeshAgent関係です。
これら↓
public NavMeshAgent agent; //①敵が自動で動くために必要
agent = GetComponent<NavMeshAgent> ();
agent.destination = goal.transform.position;
ですが、これらはオブジェクトを自動で
目的地に向かって動かせる機能を使うために必要な
コードです。
詳しくはNavMeshAgentで敵を移動させる
という記事のなかで全部説明したので、
以下の記事を読んでください。
すると敵を動かせます。
敵とプレイヤーの距離をはかるコード
②で次にこれが本記事のメイン部分でして、
以下のコードで敵に近づくとという部分を作っていけます。
それに当たるコードは、
public float distance; //②プレイヤーと敵の距離を格納する変数(distane=距離)
void Update () {
//②二者間の距離を計算してfloat 一定値いかになれば追跡する
distance = Vector3.Distance (transform.position, goal.transform.position);
}
ですが、
このVector3.Distance ();という関数を使うと、
先ほどと説明がダブりますが、
オブジェクトとオブジェクト同士の距離を
算出してくれます。
でその距離はfloat値で出ます。
(Debug.Log(distance);で見ると一発でわかります)
つまりこの関数を使うと、
敵オブジェクトとプレイヤーオブジェクトの距離を
算出してくれます。
なのでこれを使うと敵に近づくと、
OOをするという機能を作れるわけです。
(ある距離まで行くとOOをするのような感じです)
でこのDistance関数はプレイヤーを動かすゲームの場合なら、
update関数の中に書いておく必要があります。
そうすると常に敵とプレイヤーの距離を出してくれ
プレイヤーが敵に近づいたらというのを検知させれます。
でこのVector3.Distance ();ですが、
()の引数の中には、2つの値をとれまして、
2つの位置情報を引数にいれれます。
例えば上記のコード例で出しました
Vector3.Distance (transform.position, goal.transform.position);
であれば、
transform.position
(このスクリプトが貼ってあるオブジェクトの位置)と
goal.transform.position
(対象になるオブジェクトの位置)
の距離を測ってくれるようになるわけです。
なので、このスクリプトを敵オブジェクトに
つけとけば、transform.positionで敵のオブジェクトの位置、
goal.transform.positionで、
プレイヤーの位置情報となり、
敵とプレイヤーとの距離を
算出できます。
近づいたら追ってくるを実装
であとは簡単でして、
次のコードの
if (distance < 5){
agent.destination = goal.transform.position; //①
}
ですが、if文を使いオブジェクト同士の距離が
5以下になれば、
agent.destination = goal.transform.position; //①
プレイヤーに向かって敵が移動してくる
が発動するようになります。
わかると思いますが、この
if (distance < 5)
distanceというのは、
distance = Vector3.Distance (transform.position, goal.transform.position);
で敵とプレイヤーの距離を格納した変数でして、
プレイヤーが移動すると常に、
敵とプレイヤーの距離の数値が変動します。
(update関数のなかに書いてるので。)
(Debug.Log(distance);で見てやるとよくわかります)
でプレイヤーが敵オブジェクトに近づいていくと、
このdistanceの値がどんどん小さくなり、
上記コードでいう5以下になりますと、
if文の中身が稼働して、
敵が動き出すという仕組みです。
つまりはプレイヤーがある一定の距離まで近づくと、
敵がプレイヤーに近づいてくる、という風になるのです。
なのでやることは割とシンプルでして、
距離をはかり、距離が一定値だったら
敵を動かすということをやれば、
敵に近づくと追いかけてくるという機能を
作れるのです。
手順の説明
でコードは説明しましたので、
あとはやり方の手順を書いておきます。
敵、プレイヤー、床を準備
まずは当然のことながら、
敵とプレイヤーと床を用意しましょう。
用意済みならここは飛ばしましょう。
次に、床にNavMeshの設定をし、
敵オブジェクトにNavMeshAgentという
コンポーネントをつけましょう。
やり方は上で紹介した記事に書いてます。
も一回貼っときます。
敵にスクリプトをつける
で次に、敵オブジェクトにスクリプトを
つけましょう。
内容はこの記事で紹介したスクリプトを
ペタっとそのまま写せばいいです。
上戻るの面倒だと思うので同じのまた載せておきます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class navtest : MonoBehaviour {
public GameObject goal;
public NavMeshAgent agent;
public float distance;
// Use this for initialization
void Start () {
agent = GetComponent<NavMeshAgent> (); //①
goal = GameObject.Find (“ここにプレイヤーのゲームオブジェクト名”);
}
// Update is called once per frame
void Update () {
distance = Vector3.Distance (transform.position, goal.transform.position);
Debug.Log (distance);
if (distance < 5){
agent.destination = goal.transform.position; //①
}
}
}
コードについての補足
で1つ補足ですが、
goal = GameObject.Find (“ここにプレイヤーのゲームオブジェクト名”);
の引数の中には、あなたのゲームでいう
プレイヤーに当たるオブジェクトの名前を書きましょう。
例えばゲームオブジェクトのCubeをプレイヤーに
見立ててるならば、
goal = GameObject.Find (“Cube”);
と書くことになります。
またもしCubeを使ってても
そのオブジェクトの名前をPlayerとかに
してるなら引数には(“Player”)と書きましょう。
動くか確認
であとは、ゲームを再生して、
プレイヤーオブジェクトで敵オブジェクトに
近づいていって、
敵が動き出したら成功です。
晴れて機能完成です。
お疲れ様です。
ということで手順としては割と
シンプルなので、やってみてください。
まとめ
それではまとめに入ります。
unityで敵に近づいたらプレイヤーを
追いかけてくるという機能を作りたいなら、
Distance関数と、
if文と、
NavMeshAgentの機能を使って、
実現しましょう。
そうすればあなたの作ってるゲームで
敵に近づくと追いかけさせれますよ。
ということで近づくと追いかけてくるの記事でしたが、
読んでもらってありがとうございました。
これができるとかなりゲームっぽくなってきますよ。
それでは。
チャーさん