unity自动unity a 寻路算法中我方小兵如何选择攻击多个小兵

Unity3D 从入门到放弃
——巡逻兵
观察者模式 - toupiOfRivia的博客 - CSDN博客
Unity3D 从入门到放弃
——巡逻兵
观察者模式
Unity3D 从入门到放弃
——巡逻兵
游戏规则:
创建一个地图和若干巡逻兵;
每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
巡逻兵碰撞到障碍物如树,则会自动选下一个点为目标;
巡逻兵在设定范围内感知到玩家,会自动追击玩家;
失去玩家目标后,继续巡逻;
计分:每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
先上UML图:
做完后的游戏动画:
(这游戏估计可以玩一天)
PS:源码在GitHub上,链接如下:
下面说一下这个的坑点:
游戏制作过程:
实例化部分:
两个预设:
两个实例的动作控制如下:
主角Animator:
Patrol Animator:
其中Speed属性判断动作,toDie触发器触发死亡。
将两个预设加上刚体(虽然没用上物理学),和胶囊触发器, 设置触发器的大小即可。
地板和墙用plane和cube实现即可。
游戏的一些特点:
巡逻兵(Patrol)的行走模式,如何实现循环走动?
动作结束后,在动作结束回调函数里再添加动作。
巡逻兵有3个动作,idle(一段时间内站着不动),walk和run,为什么强行搞walk和run两个动作呢,因为为了改巡逻兵的速度和Animator的某些参数,达到动作状态转移的目标,这样,巡逻兵在没有发现主角到自己区域的时候不会移动的很快,同时是一个走路的动作,而主角到了巡逻兵所在的区域,巡逻兵会加快速度并且换一个动作(其实应该换跑步动作,只不过我下的模型没有跑步动作…所以换了个攻击动作),这样可以体现出发现敌人前后的区别,让游戏更好玩。
当巡逻兵是idle状态的时候,(刚开始游戏或者由于主角离开了一个区域,到了新的区域),我们就会调用idle动作,当站着不动的时间消耗完毕的时候,我们就会调用回调函数,从而让巡逻兵做预先设置好的下一个动作,空闲-&往左走-&往上走-&往右走-&往下走-&如此循环,就实现了巡逻的功能。
巡逻兵添加动作后,移动过程中碰到墙或者走到区域边界怎么办?
利用巡逻兵Collision碰撞检测方法,检测到碰撞,发送信号,销毁现在的动作,再添加往相反方向走的动作。
巡逻兵动作切换:
巡逻兵动作变换的时候,需要销毁该对象之前的动作,我们可以在每个具体动作结束的时候删除那个动作,保证巡逻兵所有时刻都只有一个动作。
发布与订阅模式(观察者模式)的应用。
当主角身上发生了某些事情(进入某个区域,与patrol碰撞,可以通过各种trigger实现),我们就可以发布相应信息,根据信息中参数的不同,对主角“有兴趣”的订阅者(patrol和SceneController)则做出相应动作(patrol会追击主角(主角进入自己区域),放弃追击(主角离开自己区域),停止动作(主角死亡,游戏结束),SceneController发布死亡信息(主角死亡),加分(到新区域))。
Trigger实现事件的检测:
小技巧:使用Quaternion.LookRotation和Quaternion.Slerp两个函数实现主角的旋转。
下面是一些坑点(不对,貌似就一个特别坑的):
主角的Animator从any state到die的状态转移条件不能仅仅是:
因为die也属于any state,当我们把isAlive设置为false的时候,会不断满足条件,触发这个状态转移,从而一直做死亡动作。
应该是这样:
当我搞完这个之后,我以为动作就没问题了,结果发现还是一直死,终于在3d群的dalao的指导下发现了要关闭动作循环,动作的一个Loop Time属性,不打勾就可以了,不会一直循环做动作了。
总结:上课认真听啊!!(暴露了什么?)方便下课做,做的时候真的是各种bug,但是你写出来了就会觉得能理解各种模式什么的了。
PS:某大佬博客链接,我参考他的做的:
我的热门文章提问: 你们做AI一般是怎么写代码的?【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:78,415贴子:
提问: 你们做AI一般是怎么写代码的?收藏
我用无限个if else 嵌套
switch case 组合 我要吐了 有没有更加优雅
耦合性更低的AI代码 求科普
神牛摄影器材--为专业摄影者打造,你值得拥有!
就拿DOTA举例好了 DOTA的小兵
不同的情况下有很多的逻辑,现在我列举几个我想到的:1、英雄对线, 一定范围内你点击敌方英雄,小兵会被吸引仇恨进而攻击你2、 小兵在相同范围内的攻击对象优先级永远是
小兵-》投石车-》英雄 3、当一波GANK发起时,如果在野外小兵被牵扯进来被拉到很远的地方, 小兵会自动返回默认的进攻路线
4、小兵如果中了冰龙大,强制攻击英雄DOTA的小兵AI肯定不止这么点 , 但是就光我列举的这几条, 思路非常的清晰,要是我来写, 肯定又是无限个if else 和 switch
case 了 不知道v社到底是用什么设计模式写出这么漂亮的游戏的
妈的 举了这么多栗子
我想来一把了
同想了解!
各种射线,四面八方射,各种自定义方法…
跟楼主一样的思路 求解
使用动画状态机
不是有个行为树的插件吗?
我没做过,但是我想把这些行为都定义成脚本。一个脚本实现一类逻辑。挂上就有,不挂上就没有。
向目标移动
登录百度帐号推荐应用Unity (三) NavMeshAgent之:分层路面导航(王者荣耀,英雄联盟中小兵分三路进攻敌方)
时间: 19:59:32
&&&& 阅读:123
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&效果:
运用分层路面导航让角色走不同的导航路线
1、新建一个静态地图
2、设置3个不同的层
3、给不同的路面设置不同的导航层
4、在导航组件里给角色设置Area Mask,设置角色可以走哪些层
1)设置char_ethan不能走Sap(下路),middle(中路)层
2)设置SapphiArtchan不能走Char(上路),middle(中)层
5、给SapphiArtchan和char_ethan添加脚本:
using System.C
using System.Collections.G
using UnityE
using UnityEngine.AI;
public class NavigationTest : MonoBehaviour {
private A //行走动画
private NavMeshA //导航组件
private T //目标位置
void Start () {
animator = GetComponent&Animator&();
agent = GetComponent&NavMeshAgent&();
target = GameObject.Find("target").
void Update () {
if (Input.GetKeyDown(KeyCode.Space)) //按空格键
agent.SetDestination(target.position); //开始导航
animator.SetBool("walk", true); //行走动画开启
if (Vector3.Distance(target.position,transform.position)&=<span style="color: #.5f) //如果到达目标1.5m
agent.isStopped = true; //结束
animator.SetBool("walk", false); //结束行走
&标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 unity3d 自动寻路 的文章

 

随机推荐