박하의 나날

[05]Battery Collector_기초적인 아이템제작

프로그래밍/Unreal

03,04 | c++ 기초적인 아이템 제작

03.Making Your First Pickup Class

_아이템 mesh(겉모습) 추가


pickup.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
 
#include "GameFramework/Actor.h"
#include "Pickup.generated.h"
UCLASS()
class BATTERYCOLLECTOR_API APickup : public AActor
{
    GENERATED_BODY()
    
public:    
    APickup();
    virtual void BeginPlay() override;
    virtual void Tick( float DeltaSeconds ) override;
 
    FORCEINLINE class UStaticMeshComponent* GetMesh() constreturn PickupMesh; }
private:
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, 
Category = "Pickup", meta = (AllowPrivateAccess = "true"))
    class UStaticMeshComponent* PickupMesh;
};
cs

04)BuildTool이 리스트에서 제일 마지막으로 찾아보는 파일이기때문에 이밑으로는 include하면 안된다. 위로까지만.

05)에디터가 가비지 콜렉션등을 할 수 있도록 알려주는 것, 키워드 설정, 기타 등등 UObject의 특성들을 갖도록 해준다.

액터는 UObject에 기반하여 만들어졌기 때문.

11) 엑터의 특성들을 위해 default값을 설정한다.

13) 매프레임마다 부른다.

15) 다른 클래스에서 mesh의 material을 변경하는걸 도와준다.

class UStaticMeshComponent* 전방선언 포인터형

GetMesh함수는 mesh Component를 변경하는것이 아니라 반환만 해주니까 const형.

16) pickup 클래스 내에서만 사용및 참조가 가능하도록.

17~19) 아이템 겉모습 로딩, static mesh component

17, 18)visibleAnywhere, BlueprintReadOnly 있는건 알지만 편집제거는 불가능하다

=액터의 블루프린트에 나타나는 static mesh component에서 조절을 할수 없다.

category = "pickup" 디테일 패널의 pickup카테고리에서 나타난다.

19) 전방선언, staticMeshComponent의 포인터. 저기 위로 올라가서 static mesh클래스를 include하고 싶지 않아서.

전방선언하기 때문에 include는 필요없다.


Pickup.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Fill out your copyright notice in the Description page of Project Settings.
 
#include "BatteryCollector.h"
#include "Pickup.h"
 
 
// Sets default values
APickup::APickup()
{
     // Set this actor to call Tick() every frame.  .
    PrimaryActorTick.bCanEverTick = false
    
    PickupMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PickupMesh"));
    RootComponent = PickupMesh; 
 
// Called when the game starts or when spawned
void APickup::BeginPlay()
{
    Super::BeginPlay();
}
 
// Called every frame
void APickup::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );
 
}
 
cs

11) tick함수를 켜고 끌수 있다. 아이템에서는 tick함수를 사용안할꺼라 false로 꺼놓음.

false 하면 tick함수가 호출되지 않는다.

13) static mesh component 생성. 

아이템이 생성되었을때 mesh가 설정되도록 생성자constructor

CreateDeafultSubobject 매크로 헬퍼

14)문제가 생길시 pickup mesh의 크기와 위치에 기초하게 된다.



04. Adding Variables & Functions 

_ 아이템 활성화조절, 기능추가


pickup.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#pragma once
 
#include "GameFramework/Actor.h"
#include "Pickup.generated.h"
UCLASS()
class BATTERYCOLLECTOR_API APickup : public AActor
{
    GENERATED_BODY()
    
public:    
    // Sets default values for this actor's properties
    APickup();
 
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;
    
    // Called every frame
    virtual void Tick( float DeltaSeconds ) override;
 
    FORCEINLINE class UStaticMeshComponent* GetMesh() constreturn PickupMesh; }
    /**True when the pickup can be used, and false when pickup is deactivated*/
    UFUNCTION(BlueprintPure, Category = "Pickup")
    bool IsActive(); 
    
    //Allows other classes to safetly change whether or not pickup is active
    UFUNCTION(BluePrintCallable, Category = "Pickup")
    void SetActive(bool NewPickupState);
 
protected:
    //true when the pickup can be used.
    bool blsActive;
    
private:
//static mesh to represent the pickup in the level
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, 
Category = "Pickup", meta = (AllowPrivateAccess = "true"))
    class UStaticMeshComponent* PickupMesh; 
    
};
 
cs

22,23)값을 반환해줄 함수

26,27)다른 클래스에서 안전하게 값을 변경할수 있도록 해주는 함수,

새로운 값은 받아야하기 때문에 파라미터로 bool값, 아이템 활성화에 상관없음.

29)상속시 자식이 사용가능하도록.

protected로 설정해 놓으면 코드에서 값을 변경하는것이나 다른 블루 프린트 또는 이를

상속받은 자식에서 변경이 가능해진다.

22,26)BlueprintPure와 BlueprintCallable

둘다 코드로 작성되었고 블루프린트에서 호출이가능하다.

pure는 값변경이 가능하지만 그러면 안된다.  반환값을 달라고 했을때 마다 실행된다.

pure는 스택에서 뭔가를 꺼내서 반환하는 스크립트가 들어있거나, 반복문이나 서로 다른 2개의 노드

통해서 두번 호출되었을 경우, 스택에서 값을 두번 꺼낸다-값이 순서에 따라 달라질수 있다.


반면 callable은 실행순서 핀에서 실행신호가 입력되었을때만 실행된다.

결과값을 아웃풋 핀에 저장해둔다. 값을 변경하지않는 함수로도 사용될수 있다.


차이점: 자주 변경하지 않을것으로 예상되는 cost가 많이 들어가는 결과값에

pure함수 보다는 callable함수가 더 적합하다는 것.

계산이 빠르고 자주 변경되는 값에는 pure함수가 더 적합하다. 아니면 callable노드 여러개를

배치해야한다(현재 계산값을 반영하려면.)


pickup.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Fill out your copyright notice in the Description page of Project Settings.
 
#include "BatteryCollector.h"
#include "Pickup.h"
 
// Sets default values
APickup::APickup()
{
     // Set this actor to call Tick() every frame.  
    PrimaryActorTick.bCanEverTick = false
 
    //all pickups start activate
    blsActive = true;
    
    PickupMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PickupMesh"));
    RootComponent = PickupMesh; 
}
 
// Called when the game starts or when spawned
void APickup::BeginPlay()
{
    Super::BeginPlay();
}
 
void APickup::Tick(float DeltaTime){
    Super::Tick(DeltaTime);
}
//return active state
bool APickup::IsActive(){
    return blsActive;
}
//change active state
void APickup::SetActive(bool NewPickupState){
    blsActive = NewPickupState;
}
cs