Unreal Engine 4 C++代码动态创建Constraint
2014-09-20 10:40
561 查看
在最新的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之后很可能是头朝下的,很喜感。
我想在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之后很可能是头朝下的,很喜感。
相关文章推荐
- Unreal Engine 4 C++ 创建对象的几种方法
- Unreal Engine 4 C++ 动态加载关卡
- 编写S-Function,创建Simulink模型并生成C++代码,编译生成可调用的动态库dll(From Simulink model to DLL A tutorial)
- Unreal Engine 4 C++ 创建对象的几种方法
- Unreal Engine 4 C++ 能够创建角色Zoom摄像头(资源)
- Unreal Engine 4 C++ Slate 介绍——用C++和Slate创建菜单(二)
- Unreal Engine 4 C++ Slate 介绍——用C++和Slate创建菜单(三)
- Unreal Engine 4 C++ 为编辑器中Actor创建自定义图标
- 用C/C++实现SMC动态代码加密技术
- C++中二维数组的动态创建与处理
- C++动态内存创建与内存管理学习笔记[2]
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- 纯 C++ 代码创建并保存 EXCEL 文件
- 用C/C++实现SMC动态代码加密技术
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- c++ TADOConnection TADOQuery TDataSetProvider TClientDataSet 动态创建
- C/C++动态内存创建与内存管理
- 用C/C++实现SMC动态代码加密技术
- 转: C++动态内存创建与内存管理学习笔记[3]
- C++动态内存创建与内存管理学习笔记[4]