2017-06-01 92 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