2017-12-14 1 views
1
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 개 또는 때로는 입방체에 도달하지 못하고 임의적으로 무작위로 나는 임의의 중간 지점을 위치가 아니라 블록으로 만들고 각 임의의 블록 센터에 도착하려고합니다.

센터 나는 서있다는 뜻입니다.

+0

꽤 정확한 설명을 것 같아요. – code11

+0

@ code11 정확한 지점에서 일부 스크린 샷을 잡기가 어렵습니다. 그래서 문제를 보여주는 아주 작은 비디오 클립을 녹음했습니다. 그리드의 각 라인에서 마지막 웨이 포인트 (블록)까지 도달하지 못하는 것을 볼 수 있습니다. 마지막 하나 이전 또는 마지막 2 이전에 회전 중입니다. 시간 1:05 비디오에서 나는 회전 속도를 바꾸고 1:30에 무작위 모드로 바꾼다. https://youtu.be/-zeoumQrBQ8 –

답변

1

쇼케이스 된 코드에서 눈부신 문제는 로컬 위치와 회전을 사용하는 것입니다. 세계에서 캐릭터와 물체를 움직이거나 회전시킬 때 세계 공간을 사용해야합니다.

로컬 위치 및 로컬 회전은 부모 개체의 위치와 회전을 기반으로합니다. 그것들을 사용하여 전 세계를 가로 질러 물건을 움직이면 이상한 문제가 발생할 것입니다.

나는 다음과 같은 대답이 상황의 그림이 도움이 될 수 있습니다 그 물건 https://teamtreehouse.com/community/global-space-vs-local-space

관련 문제