using System.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Waypoints : MonoBehaviour
{
public GameObject[] waypoints;
public Transform target;
public float moveSpeed = 10f;
public float slowDownSpeed = 3f;
public float reverseSlowDownSpeed = 3f;
public float rotationSpeed = 1f;
private int targetsIndex = 0;
private Vector3 originalPosition;
private GameObject[] players;
public Transform reverseTarget;
private int reverseTargetsIndex = 0;
private Vector3 reverseOriginalPosition;
public bool random = false;
public bool getNextRandom = true;
// Use this for initialization
void Start()
{
waypoints = GameObject.FindGameObjectsWithTag("Blocks");
players = GameObject.FindGameObjectsWithTag("Player");
originalPosition = players[0].transform.localPosition;
}
// Update is called once per frame
void Update()
{
if (random == true)
{
RandomWayPointsAI();
}
else
{
WayPointsAI();
}
}
private void WayPointsAI()
{
if (targetsIndex == waypoints.Length)
targetsIndex = 0;
target = waypoints[targetsIndex].transform;
if (MovePlayer())
targetsIndex++;
}
private void ReverseWayPointsAI()
{
if (reverseTargetsIndex == 0)
reverseTargetsIndex = waypoints.Length - 1;
reverseTarget = waypoints[reverseTargetsIndex].transform;
if (MovePlayer())
reverseTargetsIndex--;
}
void RandomWayPointsAI()
{
if (random == true && getNextRandom)
{
int index = UnityEngine.Random.Range(0, waypoints.Length);
target = waypoints[index].transform;
getNextRandom = false;
}
getNextRandom = MovePlayer();
}
bool MovePlayer()
{
float distance = Vector3.Distance(players[0].transform.position, target.transform.position);
players[0].transform.localRotation = Quaternion.Slerp(players[0].transform.localRotation, Quaternion.LookRotation(target.position - players[0].transform.localPosition), rotationSpeed * Time.deltaTime);
//move towards the player
if (distance < 30)
{
players[0].transform.localPosition += players[0].transform.forward * slowDownSpeed * Time.deltaTime;
}
else
{
players[0].transform.localPosition += players[0].transform.forward * moveSpeed * Time.deltaTime;
}
if (distance < target.transform.localScale.magnitude)
return true;
else
return false;
}
void DrawLinesInScene()
{
// draw lines between each checkpoint //
for (int i = 0; i < waypoints.Length - 1; i++)
{
Debug.DrawLine(waypoints[i].transform.position, waypoints[i + 1].transform.position, Color.blue);
}
// draw a line between the original transform start position
// and the current transform position //
Debug.DrawLine(originalPosition, players[0].transform.position, Color.red);
Debug.DrawLine(reverseOriginalPosition, players[1].transform.position, Color.red);
// draw a line between current transform position and the next waypoint target
// each time reached a waypoint.
if (target != null)
Debug.DrawLine(target.transform.position, players[0].transform.position, Color.green);
if (reverseTarget != null)
Debug.DrawLine(reverseTarget.transform.position, players[1].transform.position, Color.green);
}
void AddColliderToWaypoints()
{
foreach (GameObject go in waypoints)
{
SphereCollider sc = go.AddComponent<SphereCollider>() as SphereCollider;
sc.isTrigger = true;
}
}
}
스크립트에는 두 가지 문제점이 있습니다.플레이어가 다음 웨이 포인트로 이동하기 위해 필요한 회전을 어떻게 계산할 수 있습니까?
이동 속도를 3으로 설정하면 회전 속도를 3 또는 4 또는 5로 설정하면 회전 속도를 최소 10으로 설정해야하므로 회전이 너무 넓어서 시간이 많이 걸립니다. 플레이어는 회전 한 후에 다시 궤도에 올라야합니다.
그러나 10 인 경우 그가 거의 회전하지 않는 것 같아서 좋지 않습니다.
나는 플레이어 회전 속도를 변경할 수 있지만 언제든지 웨이 포인트 트랙에 유지할 수 있기를 원합니다. 나는 플레이어가 도달하는 각 웨이 포인트가 그가 중심에 있다는 것을 의미합니다. 이 경우 큐브는 웨이 포인트를 터치하는 것뿐만 아니라 센터로 이동하여 다음 웨이 포인트로 이동하는 것입니다.
내가 보는 또 다른 문제는 RandomWayPointsAI()
난 그냥 그리드 주위에 임의 위치를 데리러 경우 또는 임의의 블록을 따기 경우 잘 모르겠어요 임의의 방법을 사용하도록 변경
(큐브 함께). 그러나 큐브에 가까워 지거나 2 개 또는 때로는 입방체에 도달하지 못하고 임의적으로 무작위로 나는 임의의 중간 지점을 위치가 아니라 블록으로 만들고 각 임의의 블록 센터에 도착하려고합니다.센터 나는 서있다는 뜻입니다.
꽤 정확한 설명을 것 같아요. – code11
@ code11 정확한 지점에서 일부 스크린 샷을 잡기가 어렵습니다. 그래서 문제를 보여주는 아주 작은 비디오 클립을 녹음했습니다. 그리드의 각 라인에서 마지막 웨이 포인트 (블록)까지 도달하지 못하는 것을 볼 수 있습니다. 마지막 하나 이전 또는 마지막 2 이전에 회전 중입니다. 시간 1:05 비디오에서 나는 회전 속도를 바꾸고 1:30에 무작위 모드로 바꾼다. https://youtu.be/-zeoumQrBQ8 –