- Home /
Question by
n-carlson1 · Jul 22, 2016 at 08:49 PM ·
movementtransformnavmesh
Navmesh works fine at longer distances but bugs out at shorter?
Here is a video of the problem http://screencast.com/t/c8RgK9Baa
And here is the script
using UnityEngine;
using System.Collections;
public class ClickToMove : MonoBehaviour {
public float shootDistance = 10f;
public float shootRate = 0.5f;
private Animator anim;
private NavMeshAgent navMeshAgent;
private Transform targetedEnemy;
private Ray shootRay;
private RaycastHit shootHit;
private bool walking;
private bool enemyClicked;
private float nextFire;
public float playerSpeed;
public PlayerStats playerStats;
public ParticleSystem rightClickIndicator;
void Awake () {
anim = GetComponent<Animator>();
navMeshAgent = GetComponent<NavMeshAgent>();
}
void Start()
{
playerSpeed = navMeshAgent.speed;
SpeedReset();
}
void Update () {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Input.GetButtonDown("Fire2"))
{
if (Physics.Raycast(ray, out hit, 100))
{
if(hit.collider.CompareTag("Enemy"))
{
targetedEnemy = hit.transform;
enemyClicked = true;
}
else
{
walking = true;
enemyClicked = false;
navMeshAgent.destination = hit.point;
navMeshAgent.Resume();
rightClickIndicator.Play();
rightClickIndicator.transform.position = hit.point;
}
}
}
if (enemyClicked)
{
MoveAndShoot();
}
if (navMeshAgent.remainingDistance <= navMeshAgent.stoppingDistance)
{
if(!navMeshAgent.hasPath || Mathf.Abs(navMeshAgent.velocity.sqrMagnitude) < float.Epsilon) //extra layer of checking is number greater than pretty much 0
walking = false;
}
else
{
walking = true;
}
// anim.SetBool("IsWalking", walking);
}
private void MoveAndShoot()
{
if (targetedEnemy == null)
return;
navMeshAgent.destination = targetedEnemy.position;
if (navMeshAgent.remainingDistance >= shootDistance)
{
navMeshAgent.Resume();
walking = true;
}
if(navMeshAgent.remainingDistance <= shootDistance)
{
transform.LookAt(targetedEnemy);
Vector3 dirToShoot = targetedEnemy.transform.position - transform.position;
if(Time.time > nextFire)
{
nextFire = Time.time + shootRate;
playerStats.AutoAttack();
//shooting code
//shootingScript.Shoot(dirToShoot); give shoot script parameter of (Vector3 shootDir) and then add line in shoot script
}
navMeshAgent.Stop();
walking = false;
}
}
public void SpeedReset()
{
navMeshAgent.speed = playerSpeed;
}
}
Comment
Your answer
Follow this Question
Related Questions
How to stop a Set Destination after it has already arrived? 0 Answers
Navmesh Agent Path Not Updating 1 Answer
Code Not Working 1 Answer
NavMesh movement and rotation 1 Answer
Character Transform shifting after colliding with objects 0 Answers