Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一网络代理_C#_Unity3d_Navmesh - Fatal编程技术网

C# 统一网络代理

C# 统一网络代理,c#,unity3d,navmesh,C#,Unity3d,Navmesh,我正在做一个RTS游戏。我做了一个正常的移动脚本,我增加了代理的停车距离,这样他们就不会互相看,也不会抽那么多。但他们仍然互相攻击 我找不到办法让特工们互相回避,不互相推搡。或者,在试图避免彼此的同时忽略物理。以下是单击移动的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class moveTest : MonoBeha

我正在做一个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();
                }
            }
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.AI;
公共类测试:单一行为{
NavMesh代理navAgent;
公共交通;
//用于初始化
无效开始(){
navAgent=GetComponent();
}
//每帧调用一次更新
无效更新(){
move();
}
无效移动()
{
雷卡斯特击中;
Ray-Ray=Camera.main.screenpointoray(输入.鼠标位置);
if(Input.GetMouseButtonDown(1))
{
移动=真;
如果(移动)
{
如果(物理射线投射(射线,命中率,1000))
{
navAgent.SetDestination(命中点);
navAgent.Resume();
}
}
}
}
}
来自以下内容(遗憾的是,这些内容不再有图像)

  • 修改。您可以将enemie的值设置为 例如30或40
  • 将障碍物组件添加到“敌人”预置中
  • 将此脚本用于敌人的移动
剧本

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;
        }
    }
}
使用UnityEngine;
使用系统集合;
公共阶层的复仇运动:单一行为{
公共转换播放器;
NavMesh代理;
导航障碍;
无效开始(){
agent=GetComponent();
障碍=GetComponent();
}
无效更新(){
agent.destination=player.position;
//测试代理和玩家之间的距离
//小于攻击范围(或停止距离参数)
if((player.position-transform.position).sqrMagnitude
基本上,这种方法试图解决的问题是,当玩家被敌人包围时,那些在攻击范围内(几乎接触到玩家)的人停止移动攻击,但第二排或第三排的敌人仍然试图接近玩家杀死他。因为他们继续移动,他们推着其他敌人,结果并不是很酷

因此,在这个脚本中,当一个敌人在攻击角色的范围内时,它会成为一个障碍,因此其他敌人会试图避开他们,而不是继续推搡,四处寻找另一条路径来接近玩家


希望它能帮助您增加导航网格代理的半径?他们仍然互相推动尝试添加导航网格障碍物?wen你控制2个单位怎么样wen你给点他们互相推我想停止推,所以他们不互相推我想我可以做同样的事情wen 1个代理到达目的地它关闭navmesh代理并打开obstical,所以另一个仍然没有到达目的地的代理不需要推动他是的,实际上你的第二个命令主要是为了解决问题,将静态代理(一旦他们不需要继续追逐玩家,就会变成静态代理)转化为其他代理的障碍。然而,我担心代理在追逐玩家时会继续相互碰撞,我不确定是否经常启用/禁用代理的障碍功能会影响游戏的性能。我不得不承认,你问的问题很有趣,但我需要做更多的研究才能得出最终的答案。我会让你不断更新我可以再问一个问题吗我如何用代码检查navmesh代理是否在我想要的目的地?我做了我想做的,现在代码看起来就是这样,我有一个问题现在我尝试激活navmesh代理我用鼠标点击它没有那么多效果