UE4版本4.17,不同版本api可能有差异

静态



1 在骨骼上加socket

在socket上右键-添加浏览资源-找到要添加的那个道具(这个只用来看效果,调位置,不会显示到最终效果中),调整socket位置,知道道具位置合适为止

2 在角色bp上,添加一个staticMesh到Mesh节点下


设置父项插槽到刚才创建的socket,选择自己要使用的道具模型

动态(蓝图)

1 创建骨骼socket,步骤同上

2  用蓝图创建跟上面静态一样的结构

注意使用蓝图和c++创建出来的staticMeshComp运行时,在角色蓝图位置是看不到的,原因未知,但武器是正确显示的




动态(代码)



效果跟上面蓝图一样
先设置socket,然后...
MyCharacter.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h"
#include "GameFramework/Character.h"
#include "TLog.h"
#include "Runtime/Engine/Classes/Engine/EngineTypes.h"
#include "Runtime/Engine/Classes/Components/InputComponent.h"
#include "Runtime/Engine/Classes/Components/StaticMeshComponent.h"
#include "Runtime/Engine/Classes/Engine/SkeletalMeshSocket.h"
#include "MyCharacter.generated.h" UCLASS()
class NDEMO_CHANGEWEAPON_API AMyCharacter : public ACharacter
{
GENERATED_BODY() public:
// Sets default values for this character's properties
AMyCharacter(); protected: virtual void BeginPlay() override; public: virtual void Tick(float DeltaTime) override; virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; //这里武器加载的是个单独的UStaticMeshComp
void WeaponAttach1();
void WeaponDettach1(); //之类武器加载的是个Actor类型的蓝图,这种较好,方便做复合物体一起绑到角色身上
void WeaponAttach2();
void WeaponDettach2(); UStaticMesh* TUStaticMesh;
};


MyCharacter.cpp

#include "MyCharacter.h"

AMyCharacter::AMyCharacter()
{
PrimaryActorTick.bCanEverTick = true;
static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereVisualAsset(TEXT("StaticMesh'/Game/model/Effects/Meshes/Items/S_Sword_Basic.S_Sword_Basic'"));
if (SphereVisualAsset.Succeeded())
{
TUStaticMesh = SphereVisualAsset.Object;
}
} void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
} void AMyCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
} void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
//测试默认按钮绑定,不用再手动设置输入 InputComponent->BindAction("Custom_Z", IE_Pressed, this, &AMyCharacter::WeaponAttach1);
InputComponent->BindAction("Custom_X", IE_Pressed, this, &AMyCharacter::WeaponDettach1); InputComponent->BindAction("Custom_V", IE_Pressed, this, &AMyCharacter::WeaponAttach2);
InputComponent->BindAction("Custom_B", IE_Pressed, this, &AMyCharacter::WeaponDettach2);
} void AMyCharacter::WeaponAttach1()
{
UE_LOG(TLog, Warning, TEXT("WeaponAttach1"));
UStaticMeshComponent* C = NewObject<UStaticMeshComponent>(this, "TestWeapon");
this->AddOwnedComponent(C);
C->RegisterComponent();
C->SetStaticMesh(TUStaticMesh);
C->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
C->SetWorldScale3D(FVector(0.8f));
C->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, TEXT("hand_right_socket")); } void AMyCharacter::WeaponDettach1()
{
UE_LOG(TLog, Warning, TEXT("WeaponDettach1"));
} void AMyCharacter::WeaponAttach2()
{ TSubclassOf<AActor> WeaponClass = LoadClass<AActor>(NULL, TEXT("Blueprint'/Game/item/TWeapon.TWeapon_C'")); AActor* MeleeWeapon = GetWorld()->SpawnActor<AActor>(WeaponClass, FVector(0,0,0), FRotator(0,0,0)); if (MeleeWeapon)
{
//通过名字获得骨骼绑点
const USkeletalMeshSocket *socket = GetMesh()->GetSocketByName("hand_right_socket");
//绑定武器模型到骨骼挂点上
socket->AttachActor(MeleeWeapon, GetMesh());
} } void AMyCharacter::WeaponDettach2()
{
UE_LOG(TLog, Warning, TEXT("WeaponDettach2"));
}




Loaction Rule说明

http://www.devqinwei.com/2016/11/03/ue4-%E5%B0%86actor-acttach-to-%E5%8F%A6%E4%B8%80%E4%B8%AAactor%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84/

这里要注意Loaction Rule有三种:Keep Relative , Keep World,Snap to Target。

Keep Relative:

将actor在当前场景中的transform移到parent(Socket)中。(当actor在world中处于原始transform时,它最终效果就是在Socket的预览中的效果。

Keep World:

保持actor在当前场景中的transform,对socket设置transform没有意义。但如果socket移动旋转缩放,会跟随相应移动旋转缩放。

Snap to Target:(最常使用)

使用Socket设置的transform,最终效果与actor在当前场景中的transform无关,最终效果等于socket中预览看到的效果。

DetachFromActor要注意,只有Keep Relative和Keep World选项。

如果使用 Snap to Target 进行attach,那么Keep World让Detach之后对保持之前在Socket调整后的最终尺寸到新的场景中(建议使用该方法);如果使用Keep Relative,则会让尺寸使用物体原始尺寸。

特殊问题记录

新建character蓝图,actor类型weapon蓝图(里面包含一个staticMesh)
直接把weapon蓝图拖到character的节点上,运行,character会自动移动,原因跟物理有关,weapon中staticMesh默认Collider设置的是BlockAllDynamic,这个只要改成不跟character碰撞就不会使character自动飞走
奇怪的是,如果直接向character上加一个staticMesh collider也设置成BlockAllDynamic却是没问题的

这个问题无论是直接拖动节点,或是代码动态绑都存在


ue4 weapon的更多相关文章

  1. UE4杂记

    一些学习UE4时的笔记,转载请注明出处. ☆ UE4逻辑 Actor 是由 AActor 类派生而来的类实例:能被放入游戏世界场景的所有游戏性对象的基础类.对象是继承自 UObject 类的类实例:虚 ...

  2. UE4蓝图与C++交互——射击游戏中多武器系统的实现

    回顾   学习UE4已有近2周的时间,跟着数天学院"UE4游戏开发"课程的学习,已经完成了UE4蓝图方面比较基础性的学习.通过UE4蓝图的开发,我实现了类似CS的单人版射击游戏,效 ...

  3. UE4物理模块(三)---碰撞查询(上)

    在前一文中介绍了如何在UE4中创建简单碰撞或者直接使用其mesh表示的复杂碰撞: Jerry:UE4物理模块(二)---建立物体碰撞​zhuanlan.zhihu.com 那么在拿到碰撞之后,就可以进 ...

  4. 【UE4 设计模式】建造者模式 Builder Pattern

    概述 描述 建造者模式,又称生成器模式.是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂 ...

  5. UE4新手引导之下载和安装虚幻4游戏引擎

    1) 进入虚幻4的官方主页(https://www.unrealengine.com/) 这里你可以获得关于虚幻4的最新资讯,包括版本更新.博客更新.新闻和商城等.自2015年起,该引擎已经提供免费下 ...

  6. UE4新手引导入门教程

    请大家去这个地址下载:file:///D:/UE4%20Doc/虚幻4新手引导入门教程.pdf

  7. ue4 c++学习推荐

    我由易到难推荐,不过在此之前还是先看看官方对于VS设置的推荐: https://docs.unrealengine.com/latest/INT/Programming/Development/Vis ...

  8. 如何创建独立的UE4服务端

    原文作者:@玄冬Wong 转载请注明原文出处:http://aigo.iteye.com/blog/2268777 这是论坛上对UE服务端功能的回答,意思是UE4提供了主流MMO网游服务端所具备的特性 ...

  9. 《Inside UE4》目录

    <Inside UE4>目录 InsideUE4 UE4无疑是非常优秀的世界上最顶尖的引擎之一,性能和效果都非常出众,编辑器工作流也非常的出色,更难得宝贵的是完全的开源让我们有机会去从中吸 ...

随机推荐

  1. SAP 第四代增强-BTE

    第四代BTE实例详解:http://blog.csdn.net/wbin9752/article/details/7954922 第三代增强(BADI实例详解) :http://blog.csdn.n ...

  2. 【python】python调用shell方法

    在python脚本中,有时候需要调用shell获取一下信息,下面介绍两种常用的调用方法. 第一种,os.system() 这个函数获取的是命令的执行状态,比如 >>> import ...

  3. Java for LeetCode 105 Construct Binary Tree from Preorder and Inorder Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that ...

  4. 剑指Offer:栈的压入、弹出序列【31】

    剑指Offer:栈的压入.弹出序列[31] 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈 ...

  5. iOS SDK:iOS调试技巧

    感谢原创 在程序中,无论是你想弄清楚为什么数组中有3个对象而不是5个,或者为什么一个新的玩家开始之后,游戏在倒退——调试在这些处理过程中是比较重要的一部分.通过本文的学习,我们将知道在程序中,可以使用 ...

  6. wordpress,cos-html-cache静态化后,点击数失效问题的解决方案

    装了wordpress cos-html-cache 静态插件后,生成了静态文件,post-views等点击数插件就失效了, 找了一些,包括有个js版本的,需要用到post-views插件,我也不想装 ...

  7. Web 攻击之 XSS 攻击及防御策略

    XSS 攻击 介绍 XSS 攻击,从最初 netscap 推出 javascript 时,就已经察觉到了危险. 我们常常需要面临跨域的解决方案,其实同源策略是保护我们的网站.糟糕的跨域会带来危险,虽然 ...

  8. bzoj2673

    限制这么多 肯定是网络流 考虑连边 首先我们计算出每行最多放的棋子数$sx[i]$,每列最多放的棋子数$sy[i]$ 首先由源点向第$i$行连流量为$sx[i]$费用为$0$的边,第$i$列向汇点连流 ...

  9. ACM学习历程—HDU5269 ZYB loves Xor I(位运算 && dfs && 排序)(BestCoder Round #44 1002题)

    Problem Description Memphis loves xor very musch.Now he gets an array A.The length of A is n.Now he ...

  10. JVM(一)虚拟机内存划分

    Java内存区域 线程私有数据区域:虚拟机栈,本地方法栈,程序计数器 线程共享数据区域:方法区,堆 程序计数器:当前线程所执行的字节码的行号指示器,JVM通过这个字节码解释器改变计数器的值,以选择下一 ...