UE4 代码总结

http://www.cnblogs.com/kadaj/p/6412937.html

1.创建关卡类

  1.创建C++类继承LevelScriptActor

  2.打开关卡蓝图 Class Settings->Parent Class 选择你之前创建好的C++类

  遇到的问题:

  1.Tick()不运行 解决方法:BeginPlay() 增加Super::BeginPlay();

2.在主关卡类里面创建UMG

  1.创建C++类继承UUserWidget,例如:UMyUserWidget;

  2.获取PlayerController,方法:GetWorld()->GetFirstPlayerController();

  3.获取UMG蓝图,方法:UClass* widget = LoadClass<UUserWidget>(nullptr,TEXT("/Game/文件名.文件名_C"));

  4.在关卡里面创建UMG,方法:UMyUserWidget* mainUMG = CreateWidget<UMyUserWidget>(GetWorld()->GetFirstPlayerController(),widget); mainUMG->AddToViewport();

  遇到问题:

  1.路径名一定要加_C;

  2.AddToViewport(参数);参数可以调整UMG之间的层级

3.UMG里面控件的使用

  1.获取最外层界面控件,方法:UPanelWidget *RootWidget = Cast<UPanelWidget>(GetRootWidget());

  2.获取里面的控件,方法:Utype* t= (Utype*)GetWidgetFromName(TEXT("控件在UMG蓝图里面的名字"));例如:UButton *btn = (UButton*)GetWidgetFromName(TEXT("Button"));

  3.点击事件,方法:btn->OnClicked.AddDynamic(this, &UMyUserWidget::OnClickButton);

  4.获取UMG里面动画,方法:(有点复杂,暂时没有找到好的方法)

  UProperty *porp = GetClass()->PropertyLink;
  UObjectProperty *objectProp = Cast<UObjectProperty>(porp);
  UObject *object = objectProp->GetObjectPropertyValue_InContainer(this);
  UWidgetAnimation* anim = Cast<UWidgetAnimation>(object);

  播放:PlayAnimation(anim);

  遇到的问题:

  1.OnClickButton方法在头文件里面一定要加 UFUNCTION()

4.在主关卡里面增加输入事件(Input)

  1.激活输入事件,InputComponent组件已继承,方法:EnableInput(GetWorld()->GetFirstPlayerController());

  2.绑定方法,方法:InputComponent->BindAxis("MoveForward", this, &ALevelScript::方法名);其方法参数为float;

  3.点击屏幕的回调,方法:InputComponent->BindTouch(EInputEvent::IE_Pressed, this, &ALevelScript::方法名);方法参数:const ETouchIndex::Type FingerIndex, const FVector Location

5.委托使用

  1.声明一个委托,方法:在头文件里面增加DECLARE_DELEGATE_OneParam(FOnSend,const FString&);这个是代参数的,有多个选择看看自己需求

  2.在头文件定义一个委托,方法:FOnSend onSend;

  3.绑定方法,方法:BindUFuntion,BindUObject

  4.Lambda方式处理,方法:class->onSend.BindLambda([&](const FString& str){需要执行的方法或处理});

  5.发送方式,方法:OnSend.ExecuteIfBound(参数);

6.定时器 

  FTimerHandle timerHandler;
  GetWorldTimerManager().SetTimer(timerHandler,this,&class::Funtion,0.0001F,true);

7.C++调用蓝图  

  1.创建C++类并增加一个函数,在函数上面增加UFUNCTION(BlueprintImplementableEvent, Category = "Test")

  2.在蓝图类Functions里面找到函数名重载一下

8.蓝图调用C++类

  1.创建C++类并增加一个函数,在函数上面增加UFUNCTION(BlueprintCallable, Category = "Test")

  2.直接搜索函数名,在Test下面









http://blog.csdn.net/st_dark/article/details/48005947

3月份学了一阵子UE4,这里做一下总结:
 1.Ue4按空格键快速切换缩放,旋转,移动模式
 2.Actor继承自aactor,可以看成是一个容器,用来装"组件"这个对象
 3.根据Unreal的传统命名规则,所有直接或间接继承自Actor的类都以首字母A开头,所有直接继承自UObject类都以首字母U开头
 4.把物体蓝图的碰撞属性设置成overlap重叠碰撞,然后碰撞判断使用重叠的那一个函数
 5.Ue4常用概念
  Hud:显示在游戏屏幕上的信息(区别与按下菜单键才出来的信息),如血量,伤害等等
  Component组件,有很多种属 性,如movecompnent表示移动属性
  Rootcompnent表示方向,位置属性
  Actor :无方位,位置的最基本的物体
  pawn :继承自actor,最常用的傀儡,可以被玩家控制器或者ai控制器操控
  character:继承自pawn,相当于添加了movecompnent的pawn,并且拥有碰撞体积(胶囊状,需要把它调整到贴图的大小)也经常用。
  Controller:分为玩家控制器和ai控制器
 6.可以利用时间轴来做出数值的渐变效果,如从走路到跑步的渐变(减少了突然跑步的唐突性),
   并且里面有一个reverse表示一个相反的速度,即接上reverse接口后又可以从跑步渐变回走路
 7.混合空间1d可以缓和各几种可以由同一个变量控制的动画,但它本质也是一个动画(只不过是几个动画的组合,但本质不变),
   而如从站到走(速度超过x到跑(速度超过y)).但记得点应用参数修改否则上面的变量名字none不会改变(如改成speed)
      该执行哪种动画(跳,游泳,还是这里的走路选择动画)都需要建立状态机来判断,
   其实这里的混合空间动画也可以直接用状态机来判断速度到达与否。所以某种意义上说混合空间动画只是为了简化状态机的蓝图书写而产生的
 8.第三人称给摄像机添加一个springarm之后就可以使得摄像机随着人物动而动,和第一人称的那个一样.注意是把摄像机拖到sringarm(弹簧臂)里作为它的子节点
 9.动画蓝图由状态机和eventgraph两部分组成,状态机用来写什么(如状态a)状态下改变动画,eventgraph用来写什么是a状态。
   类蓝图则用来放入形象,动画蓝图,控制器等等,相对于精灵。也可以加入其它组件(如摄像机,弹簧臂)让他们和角色成为同一个组件一起移动
   只有在场景里放入物体的蓝图才能接受控制,直接放入物体则不行,因为物体无法直接添加属性,自然无法接受控制属性。
 10.自适应旋转的移动(orient rotation movement),这个在类蓝图里记得勾上,可以在主角左移右移时通过旋转人物改变人物的朝向,但记得你首先得把人物的yaw设置为至少360才能各种x轴旋转。
 11.之所以不能切换视角是因为springarm没有设置为use pawn control rotation!
    默认没勾上。
    所以通过设置 find camera component when view 成第一人称视角可以动是因为此时忽略了camera和springarm.
 12.蓝图里直接添加按键和inputs里在action mapping处设置按键效果一样,都是按下一瞬间有效果,那种长按的效果只有inputs的axis mapping设置才行
 13.在物体move components里设置的max walk speed 表示的是物体在接收到移动命令后一瞬间能够到达的速度,以后将一直维持这个速度。
    并且这个速度将作为值传递需要的变量(如需要通过值判断播放哪种动画的变量)。它并不表示物体的速度不能设置的更大了。所以可以把max walk speed设置为100,并在动画蓝图里将100处设为walk,200处设为run,那么自然一般情况下只会播放walk动画,然后你可以通过设置一个跑步键,按下它的时候max walk speed(也就是一般走路速度)将达到200,松开回到100,那么自然就可以播放和停止跑步动画
    14.Ue4技巧,打开场景蓝图,再返回原场景,选中a,再返回蓝图,则右键出来的全是a类型的函数并且target自动帮你设成了a.只有打开场景蓝图编辑才会这样.
    其实很多地方,你点击了某个组件,再右键创建蓝图功能,默认对象或组件就是刚刚点击的那个
 15.Spawn actor蓝图函数用来添加actor,如产生子弹,那么就写一个子弹蓝图,给这个蓝图add compnent一个mesh(如球体mesh或者正方体mesh),然后就可以每次按下出现这么个mesh了
    16.任何compnent都没有实体显示能力,它们只是一些类罢了,想要在蓝图里体现出这些属性必须给actor添加拥有贴图效果的类(如basic sphere等且设置它们的贴图)。
       可以给actor创建一个实体如球,再给这个球添加各种compnent作为子节点,该actor就具有各种属性了。但注意,一如果父节点和子节点有重复的属性,如碰撞属性,则以父节点的属性为依据,父允许碰撞则可以,子允许而父不允许仍然不允许
    17.Get control rotation用来获得的不是角色所面向的方位,而是你(控制者而不是pawn)所直视的方位,如第一人称发射子弹时需要一直朝着你面向的方向发射
    但是get actor rotation则可以获得角色面向的方位
 18.可以在类bp里写函数,在levelbp里调用,但(除了输入命令外)也可以全部在那个类的bp里完成,写在levelbp里主要是为了全局统筹,便于管理.
  1.但记住在类bp里写的函数不能有引用自身的情况出现,不然就是c++里的类的重复包含。
  2.输入按键操作只有场景bp和自己控制的那个bp里写才有效,其它bp里写了,但是由于没有接受你的控制所以按键当然是无效的,这时可以在那个bp里面写好函数,levelbp里使用按键来控制它,达到了不换控制者而操作的目的
    19.Getplayer pawn(character)函数可以在任何时候获得主角对象


原文地址:https://www.cnblogs.com/nafio/p/9137079.html