2021年7月16日金曜日

#4 敵に見つかると追いかけれるようにする

こんにちは!ぴちおです。

前回敵キャラを徘徊させるようにしました。

今回は敵キャラがプレイヤーを見つけると追いかけてくる仕組みを作ります。


仕組みとしては

敵キャラからレイを飛ばして

プレイヤーを見つけたら、プレイヤーの場所にNavMeshで移動

視界から消えた場合、プレイヤーの場所に到着したら、徘徊モードに戻る。


まずは、ますは敵の探索範囲を作ります。

敵オブジェクト[enemy]の下に

空のオブジェクト[CollisionDetector]を作成

スフィアコライダーを追加、スクリプト「searchPlayer」を作成

中身を書いていきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SearchPlayer : MonoBehaviour
{
EnemyController script; //UnityChanScriptが入る変数
private RaycastHit hit;
// Start is called before the first frame update
void Start()
{
script = transform.parent.gameObject.GetComponent<EnemyController>();
}

private void OnTriggerStay(Collider other)
{
if (other.CompareTag("Player"))
{
GameObject Target = GameObject.Find("player");
var diff = Target.transform.position - transform.position;
var distance = diff.magnitude;
var direction = diff.normalized;
if(Physics.Raycast(transform.position, direction, out hit, distance))
{
if(hit.transform.gameObject == Target)
{
script.targetPlayer = Target;
}
}
}
}

private void OnTriggerExit(Collider other)
{
script.targetPlayer = null;
}
}

コライダーに接触したら、

タグを確認、プレイヤーであれば、

レイ発射!壁とかないのを確認して、

なければenemyのtargetPlayerにヒットしたプレイヤーをセット。

コライダーから外れたら、targetPlayerを空にする。


{
private float i=0;
private NavMeshAgent agent = null;
[SerializeField] private DestinationController destinationController;
private bool arvFlg = false;
private float waitMaxTime = 5f;
private float waitTime;
private float waitCount = 0f;
public GameObject targetPlayer;

GameObjectを宣言

void Update()
{
if(targetPlayer != null){
destinationController.SetDestination(targetPlayer.transform.position);
agent.SetDestination(destinationController.GetDestination());
}
else
{
if(Vector3.Distance(transform.position, destinationController.GetDestination()) < 1.5f)
{
・・・・

}
}
}

Update内にターゲットが決まっている場合そこを目的地に移動するロジックを追加


壁があると、ちゃんと避けたり、視界を遮ったりします。

あ、もちろん、BAKEし直しとか必要です。




参考にさせていただいたサイト:

 

0 件のコメント: