Question by
amontejo2 · May 14, 2019 at 03:44 PM ·
navmeshcollision detectionnavmeshagent
Require Help with NavMesh
I'm making a game for a class project where if I look at an enemy it doesn't move and I tried implementing NavMesh because it's rather annoying for it to go through walls. (It's meant to practically teleport towards you if any of you know about SCP-173) How it works is when I collide with the enemy - in this instance, SCP-173 - it's supposed to play a "GameOver" animation by checking if boolean value "isGameOver" is true. But the collision method isn't recognize when I bake the terrain but even with the NavMesh Agent attached to the SCP it works when the terrain is not baked. What do I do?
SCP-173's Movement Code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityStandardAssets.Characters.FirstPerson;
public class SCPMovement : MonoBehaviour
{
public float speed = 1f;
public Transform target; //Reference to Player
private NavMeshAgent agent;
public bool isGameOver = false;
private Raycast raycast;
// Use this for initialization
void Start()
{
agent = gameObject.GetComponent<NavMeshAgent>();
raycast = target.GetComponent<Raycast>();
}
// Update is called once per frame
void Update()
{
if (raycast.looking == false)
{
agent.SetDestination(target.position);
float step = speed * Time.deltaTime;
transform.LookAt(target);
transform.position = Vector3.MoveTowards(transform.position, target.position, step);
}
}
void OnCollisionEnter(Collision other)
{
if(other.gameObject.name == "Player")
{
print("Destroyed");
isGameOver = true;
print("Destroyed");
speed = 0f;
raycast.looking = true;
}
}
}
Player's Code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Raycast : MonoBehaviour {
public Transform target;
public bool looking = false;
CharacterController charCtrl;
// Use this for initialization
void Start () {
charCtrl = GetComponent<CharacterController>();
}
// Update is called once per frame
void Update () {
RaycastHit hit;
Vector3 p1 = transform.position + charCtrl.center;
float distanceToObstacle = 0;
// to see if it is about to hit anything.
if (Physics.SphereCast(p1, charCtrl.height * 4 , transform.forward, out hit, 500) && hit.collider.gameObject.CompareTag("gameObject"))
{
looking = true;
print("Hit!");
distanceToObstacle = hit.distance;
}
else
{
looking = false;
}
}
}
Game Over Check Code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameOverScript : MonoBehaviour {
Animator anim;
public SCPMovement scpmovement;
public FinishZone finished;
// Use this for initialization
void Start () {
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
if (scpmovement.isGameOver == true)
{
anim.SetTrigger("GameOver");
}
}
}
Comment