Unreal Engine 4 C++代码动态创建Constraint

在最新的Unreal Engine 4.4版本中,Blueprint内的PhysicsConstraint是有bug的,Blueprint不能编辑Constraint的两个Actor组件,唯一的方法是通过C++代码来实现。还有很多这样的问题,好在源代码都给你了,想怎么改随自己。

我想在ThirdPerson这个模板里实现角色荡秋千的功能,就像波斯猴子里面这种。

首先,给Character Blueprint添加一个UPhysicsConstraintComponent:

UPROPERTY(VisibleDefaultsOnly, Category = "NanConstraint")

TSubobjectPtr<class UPhysicsConstraintComponent> ConstraintComp;

还需要一个固定的物理对象,当栓绳子的桩子,所以再添加一个USphereComponent:

UPROPERTY(VisibleDefaultsOnly, Category = "NanConstraint")

TSubobjectPtr<class USphereComponent> BlockSphere;

在Character的构造函数中初始化它们:

//创建Constraint Component

ConstraintComp = PCIP.CreateDefaultSubobject<UPhysicsConstraintComponent>(this, TEXT("ConstraintComp"));

FConstraintInstance ConstraintInst;

ConstraintComp->ConstraintInstance = ConstraintInst;

BlockSphere = PCIP.CreateDefaultSubobject<USphereComponent>(this, TEXT("BlockComponent"));

定义两个方法Swing()和UnSwing(),一个启动Constraint,一个断开Constraint

void ANanProjectCharacter::Swing()

{

FVector CharLocation = GetActorLocation();

FVector SphereLocation = CharLocation + FVector(0, 0, ConstraintLen);

CapsuleRot = CapsuleComponent->GetComponentRotation();

BlockSphere->SetWorldLocation(SphereLocation);

CapsuleComponent->SetSimulatePhysics(true);

ConstraintComp->SetWorldLocation(SphereLocation);

ConstraintComp->SetConstrainedComponents(BlockSphere, NAME_None, CapsuleComponent, NAME_None);

}

void ANanProjectCharacter::UnSwing()

{

CapsuleComponent->SetSimulatePhysics(false);

ConstraintComp->BreakConstraint();

CapsuleComponent->SetWorldRotation(CapsuleRot);

}

需要注意的是,Character的CapsuleComponent本身是不启用物理模拟的,为了让他摆起来,需要在启用Constraint之后,将他加入物理模拟。当然断开的时候,也别忘了再次禁用它。CapsuleRot保存启用物理模拟前,CapsuleComponent的旋转,如果不修正,角色断开Constraint之后很可能是头朝下的,很喜感。

时间: 2024-11-05 13:41:14

Unreal Engine 4 C++代码动态创建Constraint的相关文章

unity3d通过代码动态创建销毁游戏对象

只能动态创建内部提供的游戏对象,代码如下: //按下C后创建 if (Input.GetKeyDown (KeyCode.C)) { GameObject s1 = GameObject.CreatePrimitive (PrimitiveType.Sphere);//创建 s1.name = "qiu";//命名 s1.GetComponent<MeshRenderer> ().material.color = Color.red;//网格渲染器 s1.transform

Asp.net mvc在view中用C#代码动态创建元素

来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p=1231. 在view中可以用c#代码foreach动态创建元素2. 不加@{}下图中c#代码变成了白色,无法识别了. 原文地址:https://blog.51cto.com/14036626/2357251

代码动态创建checkbox

根据数据库的内容动态创建Checkbox控件并显示在Panel上 dataset ds=new dataset(); CheckBox[ ] cb=new CheckBox[ds.tables[0].Rows.count]; for(int i=0;i<ds.tables[0].Rows.count;i++) { cb[i]=new checkBox(); cb[i].id=i.tostring(); cb[i].text=ds.table[0].rows[i]["ColName"

通过代码动态创建IIS站点

对WebApi进行单元测试时,一般需要一个IIS站点,一般的做法,是通过写一个批处理的bat脚本来实现,其实通过编码,也能实现该功能. 主要有关注三点:应用程序池.Web站点.绑定(协议类型:http.https,IP地址,端口,主机名) 1.总体代码 var webSite = app.WebSite; using (var sm = new ServerManager()) { //创建应用程序池 var appPool = sm.ApplicationPools.FirstOrDefaul

通过代码动态创建Windows服务

开发完Windows服务后,一般通过如下命令进行注册Windows服务 @echo off %SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\installutil.exe %~dp0\服务程序.exe pause 除了脚本的方式,通过代码,也可以注册Windows服务: var ti = new TransactedInstaller(); ti.Installers.Add(new ServiceProcessInstaller { Acco

基于jquery的表格动态创建,自动绑定,自动获取值

最近刚加入GUT项目,学习了很多其他同事写的代码,感觉受益匪浅. 在GUT项目中,经常会碰到这样一个问题:动态生成表格,包括从数据库中读取数据,并绑定在表格中,以及从在页面上通过jQuery新增删除表格.如下所示: 在实现过程中,开发人员经常采用如下方式来实现: 1)          在前台,通过js生成表格行的html字符串,然后通过jquery的after方法加到表格底部. 2)          在后台,读取数据库,然后生成表格的html字符串,然后传递给前台渲染 3)         

ExtJS动态创建组件

J是代码动态创建dom: 或者 eval有后台组织代码,前台执 ======================= ExtJS组件的动态的创建: 程序中大多数时候需要在后台根据业务逻辑创建符合要求的组件,这时候我们就必须在后台设置表示变量. 前台页面进行动态的创建,创建完之后最新对页面的组件进行刷新,否则显示不出来. 常见的方法: doLayout:对组件进行重新布局-也就是刷新 el:获取组件的html元素---组件渲染以后会有这些元素 ownerCt:获取组件的容器------这个方法很重要 f

unity3d UGUI动态创建窗口获取窗口大小的问题

    private IEnumerator RefreshProcess(Vector2 worldPosition)     {         this.Renders();         yield return null;         yield return null;         mRootWidth = (mRoot as RectTransform).rect.width;         mrootHeigh = (mRoot as RectTransform).

JS动态创建combobox

在平时的学习过程中没有怎么写过JS代码,因为不熟悉,所以多多少少对JS代码有一种恐惧.到了公司,铺天盖地的JS代码,简直让人哭笑不得.在这漫天都是JS代码的世界里,我也慢慢的见识了些许,以一个小功能先来热热身: 使用JS代码动态创建combobox,功能很简单就是使用ajax异步从后台获取数据,然后在前台显示就可是了,那么具体的JS代码如何写呢?后台的代码又如何写呢? Js: <span style="font-size:18px;">$dialog.find("