太空工程师吧 关注:31,768贴子:456,901
  • 37回复贴,共1

Programmable Block 【编程模块 真-入门】NPC的无人机代码分析

只看楼主收藏回复

受到@cactusir 的启发,我也来抛砖引玉吧,下面是Argentavis 放出来的无人机上的程序模块,由时钟模块每1秒钟运行一次,每句代码后面都有我简单的注释,理论上如果把remote.GetNearestPlayer改成获取最近的敌人的API,就可以实现自动攻击的无人机,具体函数名我还得去翻翻。。。
List<IMyTerminalBlock> list = new List<IMyTerminalBlock>(); //声明一个块列表
void Main(string argument) //主函数
{
Vector3D origin = new Vector3D(0, 0, 0); //声明一个3D坐标origin用来存放出生地坐标
//检查是否有出生地坐标,这里是以String的结构来存在this.Storage里面的
if (this.Storage == null || this.Storage == "")
{ //this.Storage里面没有存出生地坐标, 便获取当前坐标,存到this.Storage和origin里面
origin = Me.GetPosition();
this.Storage = origin.ToString();
}
else
{ //如果this.Storage已经有坐标了,就把它从String字符解析成Vector3D的坐标,存到origin里面
Vector3D.TryParse(this.Storage, out origin);
}
//从船上所有块中获取类型为IMyRemoteControl的块,即找到远程遥控模块,放到list里面
GridTerminalSystem.GetBlocksOfType<IMyRemoteControl>(list);
if (list.Count > 0)
{ //如果找到(即数量不为0),则获得该实例,存到remote里面
var remote = list[0] as IMyRemoteControl;
remote.ClearWaypoints(); //清除目的地
Vector3D player = new Vector3D(0, 0, 0); //新建一个坐标player
bool success = remote.GetNearestPlayer(out player); //查找附近是否有玩家,如果有把其坐标放到player里面
if (success)
{ // 如果附近有玩家
bool gotoOrigin = false;
//从船上所有块中获取类型为IMyUserControllableGun的块,即找到机枪,放到list里面
GridTerminalSystem.GetBlocksOfType<IMyUserControllableGun>(list);
if (list.Count == 0)
{ //如果没有枪了,设置返回出生地
gotoOrigin = true;
}
else
{ //如果有枪
bool hasUsableGun = false;
for (int i = 0; i < list.Count; ++i)
{ //遍历查询
var weapon = list[i];
if (!weapon.IsFunctional) continue; //是否还能正常使用
if (weapon.HasInventory() && !weapon.GetInventory(0).IsItemAt(0)) continue; //是否有弹药
hasUsableGun = true; //如果又能使用又有弹药,开始攻击玩家
}
if (!hasUsableGun)
{ //如果没有可用的枪或没弹药,返回出生地
gotoOrigin = true;
}
}
if (Vector3D.DistanceSquared(player, origin) > 3000 * 3000)
{ //如果玩家和出生地的坐标距离超过3000X3000 就返回出生地
gotoOrigin = true;
}
if (gotoOrigin)
{ //返回出生地的实现代码,将远程模块的目的地设置为Origin的坐标
remote.AddWaypoint(origin, "Origin");
}
else
{ //攻击玩家的实现代码,将玩家的坐标设置为目的地,这里只是设置了目的地,于是船头会一直对准玩家,船头的炮塔便会一直自动攻击
remote.AddWaypoint(player, "Player");
}
remote.SetAutoPilotEnabled(true); //启动远程模块航行
}
}
}


回复
1楼2015-11-03 00:39
    呃, 虽然啃代码很生涩, 依然希望对大家有所帮助


    回复
    2楼2015-11-03 00:40
      刚刚还在研究呢,很有用


      回复
      3楼2015-11-03 01:15
        这个出生地可以实时变更吗?


        收起回复
        来自Android客户端4楼2015-11-03 07:58
          不过这个追踪只限玩家啊,不知道有没有持续广播某个坐标然后无人机过去巡航的方法,那样就可以玩成黑暗森林了


          收起回复
          来自iPhone客户端5楼2015-11-03 13:14
            话说有没有获取指定区域内敌人的API?
            有没有获取某天线所广播的信息(天线的名称)的API?
            如果有的话,可以实现母舰-无人机察打一体,母舰使用多部雷达(如果用立即启用的话频率太高,服务器内很容易失效)搜索敌人,通过激光天线或者天线将信息广播给自己无人机,无人机通过这一坐标,获知敌人区域,同时因为限速,所以通过双方距离,可以将确定目标可能出现的范围,然后暴打对方。
            因为如果每部无人机都用大范围侦察的话,首先会很卡(搜索范围越大越卡……),而且很容易产生混乱,而且攻击目标不一致,并且不能由母舰指定目标。所以由母舰统一指挥是一个更好的选择


            收起回复
            6楼2015-11-04 22:03
              百度这垃圾排版,标注看得难受死


              收起回复
              来自Android客户端7楼2015-11-04 23:42
                楼主可不可以顺便把用到的API推广的介绍一下?


                收起回复
                来自iPhone客户端8楼2015-11-05 00:42
                  npc的找人函数只有在所属是npc(海盗)时才可调用,否则返回false


                  回复
                  9楼2015-11-16 13:03
                    npc的找人函数只有在所属是npc(海盗)时才可调用,否则返回false


                    回复
                    10楼2015-11-16 13:08
                      新萌表示好奇这代码稍微修改一下的话能不能做出其他的无人NPC载具


                      回复
                      11楼2015-11-17 03:51
                        好棒,谢谢楼主的科普!


                        回复
                        12楼2015-12-15 16:09
                          看起来好高级啊!一直不知道编程模块有什么用


                          回复
                          来自Android客户端13楼2015-12-15 16:19