Всем доброго времени суток. Пользуясь всеобщей поддержкой получилось вот что:
есть FPSplayer, есть енеми, к енеми прикреплено две пустышки(одна зона слышимости(сфера колайдер), другая зона видимости(типа пирамида), обе соответственно тригеры(кста "пирамида" взгляда сделана в майе и чтобы правильно реагировала в настройках меш колайдера выставлен convex)).Ну так вот енемиАИ скрипт таков:
Используется csharp
using UnityEngine;
using System.Collections;
[RequireComponent (typeof(CharacterController))]
public class EnemyAI: MonoBehaviour {
public Transform target;
public int moveSpeed;
public int rotSpeed;
public float minDis;
private Transform myTransform;
//opredelenie celi===========
private bool _targDaNo;
public bool _sluh;
public bool _vzglyad;
//===========================
void Awake(){
myTransform = transform;
}
void Start () {
target = null;
_sluh = false;
_vzglyad = false;
_targDaNo = false;
}
void Update () {
if(target){
if(_sluh){
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation
(target.position-myTransform.position),
rotSpeed*Time.deltaTime);
}
if(_vzglyad){
float dist = Vector3.Distance(target.position,myTransform.position);
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation
(target.position-myTransform.position),
rotSpeed*Time.deltaTime);
if(dist>minDis){
myTransform.Translate(0,0,moveSpeed*Time.deltaTime);
}
}
}
}
public void GetTargetSluh(Collider targPoint,bool sluhT,bool targDANOT){
if(!targDANOT){
target = null;
_sluh = sluhT;
}
else {
target = targPoint.transform;
_sluh = sluhT;
}
}
public void GetTargetVzglyad(Collider targPoint,bool vzglyadT){
target = targPoint.transform;
_vzglyad = vzglyadT;
}
}
скрипт зоны слышимости вот:
Используется csharp
using UnityEngine;
using System.Collections;
public class EnemySluh : MonoBehaviour {
public Transform target;
//opredelenie celi===========
private bool _targDaNo;
private bool _sluh;
//===========================
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter(Collider other){
if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
_targDaNo = true;
_sluh = true;
EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
EAI.GetTargetSluh(other,_sluh,_targDaNo);
}
}
void OnTriggerExit(Collider other){
if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
_targDaNo = false;
_sluh = false;
EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
EAI.GetTargetSluh(other,_sluh,_targDaNo);
}
}
void OnTriggerStay(Collider other){
if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
_targDaNo = true;
_sluh = true;
EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
EAI.GetTargetSluh(other,_sluh,_targDaNo);
}
}
}
скрипт взгляда -
Используется csharp
using UnityEngine;
using System.Collections;
public class EnemyVzglyad : MonoBehaviour {
public Transform target;
//opredelenie celi===========
private bool _vzglyad;
//===========================
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter(Collider other){
if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
if(!Physics.Linecast(target.position,other.transform.position)){
_vzglyad = true;
EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
EAI.GetTargetVzglyad(other,_vzglyad);
}
}
}
void OnTriggerExit(Collider other){
if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
_vzglyad = false;
EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
EAI.GetTargetVzglyad(other,_vzglyad);
}
}
void OnTriggerStay(Collider other){
if(((other.CompareTag("Player"))||(other.CompareTag("NPC")))&&(other.transform!=target.transform)){
if(!Physics.Linecast(target.position,other.transform.position)){
_vzglyad = true;
EnemyAI EAI = (EnemyAI)target.gameObject.GetComponent("EnemyAI");
EAI.GetTargetVzglyad(other,_vzglyad);
}
}
}
}
В итоге все нормально работает, когда меня енеми слышит он поворачивается а если видит то преследует, но есть загвоздка в препятствиях: в скрипте взгляда стоит linecast, но если даже между игроком и енеми есть скажем стандартный box, то он все равно меня видит. Подскажите в чем я ошибся. ЗЫ:ссылаясь на подобные темы форума условие менял таким образом
Используется csharp
RaycastHit hit;
if(!Physics.Linecast(target.position,other.transform.position,hit)){
, но выдает ошибку - use of unassigned local variable "hit". оч нужна помощь