2017-03-02 7 views
0

ウェイポイントが小さいサイズ、例えば0.1または1のサイズの立方体の場合は問題ありません。 途中に2つのウェイポイントがあるが、敵が2つ目のウェイポイントに到達する状況がある場合は、最初のウェイポイントの壁に貼り付けられ、吃音/吃音が試される状況がある場合、キューブのサイズを20-30に変更するといずれかの側に行くと、最終的に彼はこのウェイポイントを通過し、目標を取得するべきウェイポイントに進みます。真ん中に非常に大きなウェイポイントがある場合、敵を次のウェイポイントに移動させるにはどうすればいいですか?

ウェイポイント(立方体)が非常に大きく、ウェイポイントが敵が得るべきウェイポイントをブロックする場合にのみ起こります。

using System.Collections; 
using System.Collections.Generic; 
using UnityEditor; 
using UnityEngine; 
using UnityStandardAssets.Characters.ThirdPerson; 

public class WayPoints : MonoBehaviour { 

    public GameObject[] waypoints; 
    public Transform target; 
    public float moveSpeed = 10f; 
    public float moveSpeed1 = 10f; 
    public float slowDownSpeed = 3f; 
    public float reverseSlowDownSpeed = 3f; 
    public float rotationSpeed = 1f; 
    private Transform myTransform; 
    private int targetsIndex = 0; 
    private Vector3 originalPosition; 
    private GameObject[] robots; 

    public Transform reverseTarget; 
    private int reverseTargetsIndex = 0; 
    private Vector3 reverseOriginalPosition; 

    public bool random = false; 

    void Awake() 
    { 
     myTransform = transform; 
    } 
    // Use this for initialization 
    void Start() 
    { 
     waypoints = GameObject.FindGameObjectsWithTag("ClonedObject"); 
     robots = GameObject.FindGameObjectsWithTag("Robots"); 

     AddColliderToWaypoints(); 
     originalPosition = robots[0].transform.position; 
     reverseOriginalPosition = robots[1].transform.position; 
    } 

    // Update is called once per frame 
    void Update() 
    { 
     if (MyCommands.walkbetweenwaypoints == true) 
     { 
      WayPointsAI(); 
      ReverseWayPointsAI(); 
     } 

     DrawLinesInScene(); 
    } 

    private void WayPointsAI() 
    { 
     if (targetsIndex == waypoints.Length) 
      targetsIndex = 0; 
     target = waypoints[targetsIndex].transform; 
     float distance = Vector3.Distance(robots[0].transform.position, target.transform.position); 
     robots[0].transform.rotation = Quaternion.Slerp(robots[0].transform.rotation, Quaternion.LookRotation(target.position - robots[0].transform.position), rotationSpeed * Time.deltaTime); 

     //move towards the player 
     if (distance < 30) 
     { 
      robots[0].transform.position += robots[0].transform.forward * slowDownSpeed * Time.deltaTime; 
     } 
     else 
     { 
      robots[0].transform.position += robots[0].transform.forward * moveSpeed * Time.deltaTime; 
     } 
     if (distance < target.transform.localScale.magnitude) 
     { 
      targetsIndex++; 
     } 
    } 

    private void ReverseWayPointsAI() 
    { 
     if (reverseTargetsIndex == 0) 
      reverseTargetsIndex = waypoints.Length -1; 
     reverseTarget = waypoints[reverseTargetsIndex].transform; 
     float distance = Vector3.Distance(robots[1].transform.position, reverseTarget.transform.position); 
     robots[1].transform.rotation = Quaternion.Slerp(robots[1].transform.rotation, Quaternion.LookRotation(reverseTarget.position - robots[1].transform.position), rotationSpeed * Time.deltaTime); 

     //move towards the player 
     if (distance < 30) 
     { 
      robots[1].transform.position += robots[1].transform.forward * reverseSlowDownSpeed * Time.deltaTime; 
     } 
     else 
     { 
      robots[1].transform.position += robots[1].transform.forward * moveSpeed1 * Time.deltaTime; 
     } 
     if (distance < reverseTarget.transform.localScale.magnitude) 
     { 
      reverseTargetsIndex--; 
     } 
    } 

    void RandomWayPointsAI() 
    { 
     if (random == true) 
     { 
      int index = Random.Range(0, waypoints.Length); 
      target = waypoints[index].transform; 
     } 
    } 

    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, robots[0].transform.position, Color.red); 
     Debug.DrawLine(reverseOriginalPosition, robots[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, robots[0].transform.position, Color.green); 
     if (reverseTarget != null) 
      Debug.DrawLine(reverseTarget.transform.position, robots[1].transform.position, Color.green); 
    } 

    void AddColliderToWaypoints() 
    { 
     foreach (GameObject go in waypoints) 
     { 
      SphereCollider sc = go.AddComponent<SphereCollider>() as SphereCollider; 
      sc.isTrigger = true; 
     } 
    } 
} 

は、私はそれが

if (distance < reverseTarget.tranform.localscale.x) 

またはターゲットと最初のAI機能と同じ

if (distance < reverseTarget.tranform.localscale.x/2) 

を作る前に、私が試した

if (distance < reverseTarget.transform.localScale.magnitude) 

を作ってみました。 しかし、何も動いていません。多分私はウェイポイントの半径を見つけるべきでしょうか? 解決方法がわかりません。

+3

パスファインディングについて質問していますか? 「ウェイポイント」は単にトリガーではないのですか? AIがA地点からB地点まで歩き、その間に壁があると、敵が壁に突き当たってしまうという問題はありますか?その場合は、[navmesh](https://docs.unity3d.com/Manual/nav-BuildingNavMesh.html)を調べて簡単に経路を見つけることができます。 – Maakep

+0

問題は、ゲームを走らせるときにウェイポイントを作成していることです。ウェイポイントはエディタには存在しません。ウェイポイントはクローンオブジェクトです。だから、どのようにすべてのウェイポイントを静的に設定してから焼くか?これは別のスクリプトで作成した後にウェイポイントを取得している行です。 waypoints = GameObject.FindGameObjectsWithTag( "ClonedObject"); –

+0

ああ!あなたはnavmeshに動的な障害物を持つことができます、そうする必要があります。 [NavMesh Obstacle here](https://docs.unity3d.com/Manual/class-NavMeshObstacle.html)を参照してください。 – Maakep

答えて

0

OPが望んだと思われるのは、AIが(ダイナミック/コード生成された)ポイントAからBに移動し、その間に障害があるとき、AIが障害物にはまった。

ユニティ提供NavMeshNavMesh Obstacleは、簡単なパスファインディングツールであり、少しでも手間をかけずにスマートなAIを実現できます。

関連する問題