新建一个继承自Weapon的子类作为派生榴弹类武器 将Weapon类中的Fire函数添加virtual关键字变为虚函数让榴弹类继承重写 在ProjectileWeapon中重写Fire函数,新建生成投射物的模版变量 Fire函数重写逻辑代码 
	UPROPERTY ( EditAnywhere, BlueprintReadOnly, Category =  "ProjectileWeapon" ) TSubclassOf< AActor>  ProjectileClass; 
void  AProjectileWeapon :: Fire ( ) 
{ AActor*  MyOwner =  GetOwner ( ) ; if  ( MyOwner) { FVector EyeLocation; FRotator EyeRotation; MyOwner-> GetActorEyesViewPoint ( EyeLocation,  EyeRotation) ; FActorSpawnParameters SpawnParams; SpawnParams. SpawnCollisionHandlingOverride =  ESpawnActorCollisionHandlingMethod:: AlwaysSpawn; FVector MuzzleLocation =  SkeletalComponent-> GetSocketLocation ( MuzzleSocketName) ; GetWorld ( ) -> SpawnActor < AActor> ( ProjectileClass,  MuzzleLocation,  EyeRotation,  SpawnParams) ; } 
} 
将派生的榴弹类创建蓝图,网格模型添加上去 将网格模型里面的插槽名字改为我们C++中定义的名字 创建一个Actor蓝图作为子弹,添加一个发射器与一个球体网格,发射器初始速度与最大速度设置为2000,开启抛物体反弹效果。球体网格开启物理模拟。 将榴弹武器蓝图生成发射物暴露在蓝图中的生成物子弹加入在其中 在角色蓝图中将实例的武器类型换为榴弹炮武器,然后把实例的对象换为父类武器,这样就方便我们测试调用函数时的问题 在子弹蓝图里面添加一个爆炸事件,然后抒写逻辑 在BeginPlay处调用该逻辑事件 运行结果 
在角色类中新建四个变量,一个用来是否开启变焦推进,一个用来表示变焦的视野范围,一个用来获取默认的视野范围,一个表示进行线性插值到新视角的速率 新建一个右击的操作输入 新建右击操作的处理函数 给移动的新视角和移动插值的速率赋值 在BeginPlay中获取默认视角范围 右击绑定函数逻辑与设置新视角线性插值范围逻辑 绑定输入操作 引擎中新建一个操作输入,然后添加到映射中 绑定操作到角色蓝图上 运行结果 
在武器类中新建一个静态变量作为控制控制台的变量,控制是否射击画线,新建自动管理控制台变量类 FAutoConsoleVariableRef :用于自动管理控制台变量的一个类 
FAutoConsoleVariableRef ACVRDebugWeaponDrawLine ( TEXT ( "COOP.DebugWeapons" ) ,  DebugWeaponDrawLine, TEXT