#c# #unity3d #path-finding
#c# #unity3d #поиск пути
Вопрос:
Я создаю простую 2d-игру с кораблями для моего школьного проекта. Прямо сейчас ии повернется лицом к игроку и будет следовать за ним на определенном расстоянии, затем, когда подойдет достаточно близко, повернется так, чтобы он мог стрелять в игрока с каждой стороны корабля. Но с моим текущим кодом враг будет двигаться боком к игроку на дальности стрельбы, чего, очевидно, не должно произойти.
Итак, как я могу заставить врага двигаться только вперед и оставаться перпендикулярным игроку.
Вот мой текущий код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
public float speed, stopD, retreatD, Chase_range, distance,firing_range;
// declare player and enemy as transform to retrieve their positions
public Transform player;
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
Chase_range = 14;
firing_range = 10;
stopD = 6;
retreatD = 4;
}
// Update is called once per frame
void Update()
{
// Distance between the enemy and player positions
distance = (Vector2.Distance(transform.position, player.position));
transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
if (distance > stopD)
{
// move towards the player if the distance is greater than stop distance
speed = 10;
}
else if (distance < stopD amp; distance > retreatD)
{
speed = 0;
}
else if (distance < retreatD)
{
// move away from the player if the distance is less than stop distance (avoid collision)
speed = -10;
}
if (distance > Chase_range)
{
// have to use vector3 since vector2 does not work with the z axis
// calculate the difference in the position vectors
Vector3 vectorToTarget = player.position - transform.position;
// Calculate the angle between the objects and convert the result to degrees
float angle = Mathf.Atan2(vectorToTarget.y, vectorToTarget.x) * Mathf.Rad2Deg;
// convert the angle into a quaternion so that it can be used by slerp
Quaternion playerq = Quaternion.AngleAxis(angle, Vector3.forward);
transform.rotation = Quaternion.Slerp(transform.rotation, playerq, Time.deltaTime * speed);
}
if (distance < firing_range)
{
float Rfactor;
Vector3 vectorToTarget = player.position - transform.position;
float angle = Mathf.Atan2(vectorToTarget.y, vectorToTarget.x) * Mathf.Rad2Deg;
if (angle < 0)
{
Rfactor = 90;
}
else if (angle > 0)
{
Rfactor = -90;
}
Quaternion playerq = Quaternion.AngleAxis(angle Rfactor, Vector3.forward);
transform.rotation = Quaternion.Slerp(transform.rotation, playerq, Time.deltaTime * speed);
}
}
И не обращайте внимания на дерьмовые комментарии, это для школы.
Любые другие комментарии по поводу кода также будут высоко оценены
Комментарии:
1. возможно, вы используете атрибут forward на неправильной оси, но я не совсем понимаю, в чем проблема, не могли бы вы уточнить?
2. Ну, код пока функционирует так, как задумано, враг вращается и движется к игроку на определенном расстоянии, а затем, когда он приближается, поворачивается так, чтобы он был перпендикулярен игроку. Что мне нужно сделать сейчас, так это сделать так, чтобы враг двигался рядом с игроком, чтобы он мог продолжать стрелять.
3. Не могли бы вы попробовать добавить смещение к его движению к оси, которая вам нравится?
Ответ №1:
С помощью быстрого поиска в Google я нашел этот ответ:
https://answers.unity.com/questions/1125044/how-do-i-move-an-object-relative-to-another-object.html
Используя это, вы можете переместить противника вперед относительно игрока. Если вы сейчас повернете игрока, вы получите желаемый результат: враг будет двигаться вместе с игроком, но сосредоточится на нем