Я создаю тактическую 3D RPG-игру, и у меня есть следующая проблема:
Я хочу, чтобы NP C перемещался по сетке. Сетка состоит из плиток, и к каждой плитке прикреплен скрипт. В этом сценарии есть переменная с именем TilePosition , которая является Vector2Int, и я использую ее для хранения значений X и Y в сетке, как вы можете видеть на изображении. К персонажу NP C прикреплен скрипт, называемый NPCPlayer , где используется Vectir2Int с именем NPCGridPosition для сохранения своей позиции в сетке.
Значения тайлов X и Y в сетке
Также относительно NP C, у него есть скрипт под названием NPCMovement . В этом сценарии я установил raycast, который начинается с NP C футов и идет вниз. Я использую raycast, чтобы взять переменную TilePosition , как написано в коде:
public void MoveNPC()
{
if (Physics.Raycast(transform.position, Vector3.down * MaxDistance, out hitDown))
{
if(hitDown.transform.tag == "Tile")
{
Tile TilesPosition = hitDown.transform.gameObject.GetComponent<Tile>();
NPCPlayer NPCPosition = this.GetComponent<NPCPlayer>();
}
}
}
Однако, когда я пытаюсь переместить NP C через сетку, 3 строки впереди он уходит, потому что он движется в соответствии с мировым положением, а не движется в соответствии с его положением плитки.
Я использую эти строки кода, чтобы заставить его двигаться:
public void MoveNPC()
{
if (Physics.Raycast(transform.position, Vector3.down * MaxDistance, out hitDown))
{
if(hitDown.transform.tag == "Tile")
{
Tile TilesPosition = hitDown.transform.gameObject.GetComponent<Tile>();
NPCPlayer NPCPosition = this.GetComponent<NPCPlayer>();
targetPosition.x = TilesPosition.TilePosition.x + 3 ;
targetPosition.y = TilesPosition.TilePosition.y;
this.transform.position = Vector3.MoveTowards(this.transform.position, targetPosition,velocity);
}
}
}
Как я могу заставить NP C двигаться в соответствии с его положением в сетке?
Я буду рад, если кто-то может немного помочь мне с этим.
Полный код:
public class NPCMovement : MonoBehaviour
{
Vector3 targetPosition;
public float velocity = 0.2f;
public RaycastHit hitDown;
public Vector3 direction = Vector3.down;
public float MaxDistance = 10f;
void Start()
{
}
void Update()
{
MoveNPC();
}
public void MoveNPC()
{
if (Physics.Raycast(transform.position, Vector3.down * MaxDistance, out hitDown))
{
if(hitDown.transform.tag == "Tile")
{
Tile TilesPositions = hitDown.transform.gameObject.GetComponent<Tile>();
NPCPlayer NPCPosition = this.GetComponent<NPCPlayer>();
targetPosition.x = TilesPosition.TilePosition.x + 3 ;
targetPosition.y = TilesPosition.TilePosition.y;
this.transform.position = Vector3.MoveTowards(this.transform.position, targetPosition,velocity);
}
}
}
}