Я составляю основы c основы RPG-игры. Его наведите и нажмите, используя navme sh. Я настроил игрока, чтобы он двигался к врагу и атаковал в радиусе действия. У меня проблема в том, что когда игрок достигает врага (или сундука / интерактива), он вращается вокруг оси х. Я предполагаю, что это как-то связано с функцией lookAt, использующей точку поворота целевого объекта, но я не могу найти решение. Любая помощь, направляющая меня к решению, была бы удивительной. Пару дней я просматривал сайты, форумы и API Unity. Я уверен, что это что-то простое, я просто не могу это увидеть.
Большая любовь
public class clickToMove : MonoBehaviour
{
// Attack variables
[Header("Attack")]
public float attackDistance;
public float attackRate;
private float nextAttack;
//Navigation variables
private NavMeshAgent navMeshAgent;
//private bool walking;
//Animation variables
private Animator anim;
//Enemy variables
private Transform targetedEnemy;
private bool enemyClicked;
//Interactable variables
private Transform targetedObject;
private bool objectClicked;
void Awake()
{
anim = GetComponent<Animator>();
navMeshAgent = GetComponent<NavMeshAgent>();
}
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Input.GetButton("Fire1"))
{
navMeshAgent.ResetPath();
if(Physics.Raycast(ray, out hit, 1000))
{
if(hit.collider.tag == "Enemy")
{
enemyClicked = true;
targetedEnemy = hit.transform;
}
else if (hit.collider.tag == "Chest")
{
objectClicked = true;
targetedObject = hit.transform;
}
else if(hit.collider.tag == "Player")
{
//walking = false;
navMeshAgent.isStopped = true;
}
else
{
//walking = true;
enemyClicked = false;
navMeshAgent.isStopped = false;
navMeshAgent.destination = hit.point;
}
}
}
if (enemyClicked)
{
MoveAndAttack();
}
else if(objectClicked && targetedObject.gameObject.tag == "Chest")
{
Interaction(targetedObject);
}
else
{
if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance <= navMeshAgent.stoppingDistance)
{
//walking = false;
}
else if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance >= navMeshAgent.stoppingDistance)
{
//walking = true;
}
}
//anim.SetBool("isWalking", walking);
//TODO: needs finishing. Still need to lock it to the y axis to stop its rotation being funny.
if (Input.GetKey(KeyCode.LeftShift))
{
//walking = false;
navMeshAgent.isStopped = true;
transform.LookAt(ray.origin + ray.direction * ((transform.position - Camera.main.transform.position).magnitude * 0.5f));
}
}
// TODO: still a bug where the player rotates 15 deg on x axis when it reaches target. Has something to do with the Lookat function.
void MoveAndAttack()
{
if (targetedEnemy == null)
{
return;
}
navMeshAgent.destination = targetedEnemy.position;
if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance >= attackDistance)
{
navMeshAgent.isStopped = false;
//walking = true;
}
else if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance <= attackDistance)
{
//anim.SetBool("isAttacking", false);
transform.LookAt(targetedEnemy);
Vector3 dirToAttack = targetedEnemy.transform.position - transform.position;
if(Time.time > nextAttack)
{
nextAttack = Time.time + attackRate;
//anim.SetBool("isAttacking", true);
}
navMeshAgent.isStopped = true;
//walking = false;
}
}
void Interaction(Transform target)
{
// set target
navMeshAgent.destination = target.position;
//go close to the target
if(!navMeshAgent.pathPending && navMeshAgent.remainingDistance > attackDistance)
{
navMeshAgent.isStopped = false;
//walking = true;
}
//read the info
else if (!navMeshAgent.pathPending && navMeshAgent.remainingDistance <= attackDistance)
{
navMeshAgent.isStopped = true;
transform.LookAt(targetedObject);
//walking = false;
//play animation
//target.gameObject.getComponentInChildren<Animator>().SetTrigger("Open");
objectClicked = false;
navMeshAgent.ResetPath();
}
}
}