2017-06-01 94 views
1

我試圖讓AI代理站在實際目標的固定位置上。當AI達到目標時轉換爲固定位置

我被要求分享代碼。這是最終狀態機的一個腳本,我在網上找到。

這裏是C#中的整個狀態代碼:

public class GoToSpecificPoint : IShopperState 
{ 
private readonly StatePatternShopper shopper; 
private readonly float distanceFromShelfModifier = 1.5f; 

private int nextWayPoint; 

private bool enRoute = false; 
private bool waitingForPlayer = false; 

private float initialPlayerDistanceFromShelf = 1f; 
private Transform playerTransform; 
private Vector3 targetLocation; 

private bool inPlayerSpace = false; 
private bool alreadyPicked = false; 

public GoToSpecificPoint(StatePatternShopper statePatternShopper) 
{ 
    shopper = statePatternShopper; 
} 

public void UpdateState() 
{ 
    if (PlayerStillAtShelf()) 
    { 
     enRoute = false; 
     waitingForPlayer = true; 
    } 

    else if (waitingForPlayer && !PlayerStillAtShelf()) 
    { 
     waitingForPlayer = false; 
     ToReachPointState(); 
    } 

    } 

private bool PlayerStillAtShelf() 
{ 
    float dist; 

    if ((dist = Vector3.Distance(targetLocation, playerTransform.position)) > (initialPlayerDistanceFromShelf * distanceFromShelfModifier)) 
    { 
     return false; 
    } 

    return true; 
} 

public void SpecificPoint(Vector3 target, Transform player) 
{ 
    alreadyPicked = false; 
    enRoute = true; 
    playerTransform = player; 
    target = new Vector3(player.position.x, 0, player.position.z - 1); 
    targetLocation = target; 

    initialPlayerDistanceFromShelf = Vector3.Distance(targetLocation, playerTransform.position); 

    shopper.meshRendererFlag.material.color = Color.red; 
    shopper.navMeshAgent.destination = targetLocation; 
    shopper.navMeshAgent.Resume(); 

    shopper.animator.SetBool("Walk", true); 
} 

}

我想要的「目標」,真正做到貼近玩家,讓AI站在一個固定的玩家變換。

編輯:場景是超市,目標是用戶。用戶正在接近貨架,AI正在接近用戶。所以我需要他們站在一條線上。

+0

我不確定我是否正確理解你 - 當你真的接近它時,你想要將AI修理到某個位置? – Fiffe

+0

您目前的代碼以何種方式失敗?它是否接近目標,但停下來?它根本不動嗎?目標是否位於導航網址上? – Serlite

+0

@Fiffe我想你可以這麼說。我想把我的AI修正到相對於目標的位置。今天,大多數腳本都有AI去達到目標,我希望它能夠站在目標附近。 –

回答

1

我可以在你的代碼中看到,你計算目標的位置,但在下一行,而不是分配一個目標targetLocation。你讓這樣的:

target = new Vector3 (player.position.x, 0, player.position.z - 1); 
target = targetLocation; // you are overriding the above calculated target 

改變該行:

targetLocation = target; 

因爲下面你要指定的targetLocation。這裏:

shopper.navMeshAgent.destination = targetLocation; 
+0

嗨@COBO,我試過了..它不適合我,我不知道... –

+0

嗨。你能否爲我提供完整的腳本,以便我可以學習並仔細測試。 – COBO