UE4实用类PawnSensingComponent简介
2015-11-21 19:56
901 查看
PawnSensingComponent是涉及AI编程时候的常用类,实现了很多强大的功能,对于AI感知帮助很大。(终于不用搞一个看不见的StaticMeshComponent来模拟视觉了(#--))
主要功能有
1.AI的视觉,是一个锥形感知体。
2.AI的听觉,主要与距离和声音大小有关,与遮挡物也有关。
首先介绍一下AI的视觉方面吧,PawnSensingComponent的初始化很简单,在类内声明一个PawnSensingComponent字段,之后
初始化其他Component是一样的,注意要给bSeenPawn指认为true,不然没有视觉回调,其次就是视觉判定的刷新时间和锥形的大小了,这个因情况而异。
值得注意的是这个Component没有继承自USceneComponent,所以他不能AttachTo其他Component,也没有自己的物理意义,没有位置角度等信息,他是直接绑定在Actor的原点上的。
最后就是挂上和视觉有关的委托了:
注意这里的AddDynamic是一个宏,不使用宏的话挂委托还是比较麻烦的。
之后每当锥形覆盖了Pawn,都会回调你的函数,之后你在经行处理就行了。
关于视觉还要说的一点就是PawnSensingComponent的CouldSeePawn和HasLineOfSightTo函数,这两个函数看名字可能觉得差不多,但是功能不太一样。总体来说:
1.CouldSeePawn仅仅简单地判断你给出的Pawn是否在锥形内。(这个考虑了锥形的覆盖,但是没有考虑遮蔽)
2.HasLineOfSightTo仅仅简单地判断你给出的Pawn是否内被这个PawnSensingComponent看见(这个又没有考虑锥形的覆盖,只考虑了遮挡)
可见真正要达到“看得见”这个目标,还是要同时进行CouldSeePawn和HasLineOfSightTo两个判断。实际上PawnSensingComponent内部判断是否能看见时,也是用的这两个,我们看看部分代码:
再来看看听觉方面:
首先要打开听觉捕捉bHearNoises,之后设置听觉阈值,最后挂上委托就行了。阈值的单位比较不直观,是发出单位1的响声之后,最大离多远能听见,比如这里就是50单位。
那么声音是怎么发出的呢?Actor类内部就有一个内建函数MakeNoise,参数都很好懂就不多说了。但是值得注意的是,你要MakeNoise的类一定要有一个UPawnNoiseEmitterComponent字段并且初始化过:
因为MakeNoise内部是使用了UPawnNoiseEmitterComponent这个对象来发声的。(比较奇怪的是,明明内建了MakeNoise函数,却不自带一个UPawnNoiseEmitterComponent字段,Epic应该有更深层次的考虑吧)
最后再提一点,就是PawnSensingComponent的一个字段bOnlySensePlayers ,默认是true,于是PawnSensingComponent只会看到和听到玩家,而不会看到或听到其他AI同类,如果想AI之间也有互动(比如AI开枪MakeNoise,其他AI会听到赶来)就要把这个字段设置为false:
这个地方卡了本屌N久,为啥我开枪有AI反应,AI开枪其他AI就没反应,原来还有这么一出。(内部似乎是通过判断声音发出者的Controller是否是Player来实现的)
主要功能有
1.AI的视觉,是一个锥形感知体。
2.AI的听觉,主要与距离和声音大小有关,与遮挡物也有关。
首先介绍一下AI的视觉方面吧,PawnSensingComponent的初始化很简单,在类内声明一个PawnSensingComponent字段,之后
this->sensingcomponent = CreateDefaultSubobject<PawnSensingComponent>(TEXT("your name")); this->sensingcomponent->SetPeripheralVisionAngle(60); this->sensingcomponent->SightRadius = 5000; this->sensingcomponent->bSeePawns = true; this->sensingcomponent->SensingInterval = 0.10;
初始化其他Component是一样的,注意要给bSeenPawn指认为true,不然没有视觉回调,其次就是视觉判定的刷新时间和锥形的大小了,这个因情况而异。
值得注意的是这个Component没有继承自USceneComponent,所以他不能AttachTo其他Component,也没有自己的物理意义,没有位置角度等信息,他是直接绑定在Actor的原点上的。
最后就是挂上和视觉有关的委托了:
this->sensingcomponent->OnSeePawn.AddDynamic(this, &AAICharacter::somemethod);
注意这里的AddDynamic是一个宏,不使用宏的话挂委托还是比较麻烦的。
之后每当锥形覆盖了Pawn,都会回调你的函数,之后你在经行处理就行了。
关于视觉还要说的一点就是PawnSensingComponent的CouldSeePawn和HasLineOfSightTo函数,这两个函数看名字可能觉得差不多,但是功能不太一样。总体来说:
1.CouldSeePawn仅仅简单地判断你给出的Pawn是否在锥形内。(这个考虑了锥形的覆盖,但是没有考虑遮蔽)
2.HasLineOfSightTo仅仅简单地判断你给出的Pawn是否内被这个PawnSensingComponent看见(这个又没有考虑锥形的覆盖,只考虑了遮挡)
可见真正要达到“看得见”这个目标,还是要同时进行CouldSeePawn和HasLineOfSightTo两个判断。实际上PawnSensingComponent内部判断是否能看见时,也是用的这两个,我们看看部分代码:
bool bHasSeenPawn = false; bool bHasFailedLineOfSightCheck = false; if (bSeePawns && ShouldCheckVisibilityOf(&Pawn)) { if (CouldSeePawn(&Pawn, true)) { if (HasLineOfSightTo(&Pawn)) { BroadcastOnSeePawn(Pawn); bHasSeenPawn = true; } else { bHasFailedLineOfSightCheck = true; } } }
再来看看听觉方面:
this->sensingcomponent->bHearNoises = true; this->sensingcomponent->HearingThreshold = 50; this->sensingcomponent->LOSHearingThreshold = 60; this->sensingcomponent->OnHearNoise.AddDynamic(this, &AAICharacter::dosomething);
首先要打开听觉捕捉bHearNoises,之后设置听觉阈值,最后挂上委托就行了。阈值的单位比较不直观,是发出单位1的响声之后,最大离多远能听见,比如这里就是50单位。
那么声音是怎么发出的呢?Actor类内部就有一个内建函数MakeNoise,参数都很好懂就不多说了。但是值得注意的是,你要MakeNoise的类一定要有一个UPawnNoiseEmitterComponent字段并且初始化过:
this->noiseemitter = CreateDefaultSubobject<UPawnNoiseEmitterComponent>("makenoise");
因为MakeNoise内部是使用了UPawnNoiseEmitterComponent这个对象来发声的。(比较奇怪的是,明明内建了MakeNoise函数,却不自带一个UPawnNoiseEmitterComponent字段,Epic应该有更深层次的考虑吧)
最后再提一点,就是PawnSensingComponent的一个字段bOnlySensePlayers ,默认是true,于是PawnSensingComponent只会看到和听到玩家,而不会看到或听到其他AI同类,如果想AI之间也有互动(比如AI开枪MakeNoise,其他AI会听到赶来)就要把这个字段设置为false:
this->sensingcomponent->bOnlySensePlayers = false;
这个地方卡了本屌N久,为啥我开枪有AI反应,AI开枪其他AI就没反应,原来还有这么一出。(内部似乎是通过判断声音发出者的Controller是否是Player来实现的)
相关文章推荐
- POJ 2299 Ultra-QuickSort
- HDU 4027 Can you answer these queries?【线段树】区间开平方,区间求和
- 手机-终端-UE
- 关于设置UILabel的文本缩进
- 爬爬爬之路:UI(九) UITableView(一) MVC模式M层的应用
- [TwistedFate]UITableView表视图
- 灭灯小游戏 UI代码
- UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释
- unique 约束和null
- 在iOS 8中使用UIAlertController
- iOS - UITableView性能优化总结
- UI基础-UIScrollView、UIPageControl
- SequenceType 与 GeneratorType
- 随意细解:UI -- UITableView表视图
- iOS开发之UITextView,设置textView的行间距及placeholder
- Android Studio在打开项目是一直处于building gradle project info的解决办法
- iOS 6.0中UIViewController被弃用的一些方法
- iOS开发 UIButton 详解
- iOS组件之UIScrollView详解
- 2015-10-15 晴 APUE GIT