Unity navmesh代理

时间:2017-10-05 18:37:04

标签: c# unity3d navmesh

我正在进行RTS游戏。我做了一个正常的移动脚本,我增加了代理人的停止距离,这样他们就不会相互看并抽出那么多。但他们仍然互相攻击。

我无法找到使代理人互相避免的方式,而不是相互推动。或者在某种程度上忽略物理,同时仍然试图避免彼此。这是点击移动的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class moveTest : MonoBehaviour {

    NavMeshAgent navAgent;
    public bool Moving;

    // Use this for initialization
    void Start () {
        navAgent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update () {
        move();
    }

    void move()
    {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Input.GetMouseButtonDown(1))
        {
            Moving = true;
            if (Moving)
            {
                if (Physics.Raycast(ray, out hit, 1000))
                {
                    navAgent.SetDestination(hit.point);
                    navAgent.Resume();
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

来自以下link(遗憾的是没有图像)

  • 修改avoidancePriority。你可以设置enemie的值 例如,30或40。
  • 将NavMeshObstacle组件添加到“敌人”预制件
  • 将此脚本用于敌人运动

脚本

using UnityEngine;
using System.Collections;
public class enemyMovement : MonoBehaviour {
    public Transform player;
    NavMeshAgent agent;
    NavMeshObstacle obstacle;

    void Start () {
        agent = GetComponent< NavMeshAgent >();
        obstacle = GetComponent< NavMeshObstacle >();
    }
    void Update () {
        agent.destination = player.position;
        // Test if the distance between the agent and the player
        // is less than the attack range (or the stoppingDistance parameter)
        if ((player.position - transform.position).sqrMagnitude < Mathf.Pow(agent.stoppingDistance, 2)) {
            // If the agent is in attack range, become an obstacle and
            // disable the NavMeshAgent component
            obstacle.enabled = true;
            agent.enabled = false;
        } else {
            // If we are not in range, become an agent again
            obstacle.enabled = false;
            agent.enabled = true;
        }
    }
}

基本上这个方法试图解决的问题是当玩家被敌人包围时,那些在攻击范围内(几乎触及玩家)的人停止移动攻击,但第二排或第三排的敌人仍在试图让玩家杀死他。由于他们继续移动,他们推动其他敌人,结果并不是很酷。

所以使用这个脚本,当一个敌人在范围内攻击角色时,它就成了一个障碍,所以其他敌人试图避开它们,而不是继续推动,四处寻找另一条路径来到达玩家。

希望它可以帮助你一些