본문 바로가기
::protected/언리얼 3

언리얼 3 작업관련 정리

by 해맑은욱 2019. 7. 11.

//@@Cast
Cast<언리얼엔진에서제공하는클래스타입>( );
ex> Cast(Pawn);

언리얼엔진에서제공하는클래스타입 -> UObject base 들

안되면 NULL 반환

//@@.uc 함수 작성법
uc 선호
{ 사용 구역 구현부 작성
function <- .uc o .native x .uc
event  <- .uc o .native o .uc
};

native 선호
{
cpptext <- .uc x .native o .native
native function <- .uc o .native o .native
};

exec  치트모드

//@@안전을 위해 예외처리 잘하기
BLPlayer = BLPLayer(Pawn) -> none일 수도 모르니
if(BLPlayer != none)

PawnPlayer = BLPLayer(Pawn);
if(PawnPlayer != none
&& PawnPlayer == PlayerPawn)
{
PawnPlayer.MyEffectGo();
}

//@@리소스가 없어 -> 잘못상황이고, 고쳐야 해
//@@죽일꺼냐 VS 죽이지 않고 -> 로그
//@@문제가 있어도 프로젝트가 돌아 갈 수 있는 방향으로

//check 걸때는 
checkf(mesh);
for(INT i = 0; i < mesh->SkelMeshBones.Num(); ++i)
{ }

if(mesh)
{
    for(INT i = 0; i < mesh->SkelMeshBones.Num(); ++i)
    { }
}

//@@TArray 자주 쓰이는 것들
//iRand = rand() % int(Mesh->SkeletalMesh->RefSkeleton.Num());
//int -> INT         native에서 정의된 자료형을 씀
TArray ArrayA;
ArrayA.Empty();
//uc ArrayA.Length = 0; //insert //Additem //Remove
INT AddedIndex = ArrayA.AddZeroed(1);
ArrayA(AddedIndex) = 100;
//ArraayA[AddedIndex]
ArrayA.AddItem(100);

//@@객체 받는 방식
대체적으로 값이 변경될 때는 "포인터(*)"를 건네고
변경되지 않을 경우에는 "참조(&)"를 사용하면 좋다.

대체로 "값에 의한 전달"보다는 "상수 객제 참조자에 의한 전달"을 선호.
벗, 기본제공 타입 및 STL 반복자, 그리고 함수 객체 타입은 값으로 전달이 적절.

//@@설계 및 선언
T* ptr = NULL 처리.
데이터 멤버는 private 멤버로 선언하기.(캡슐화)

//@@자료 구조
단순 구조(정수int 실수float,double 문자(열)char)
선형 구조(리스트 스택 큐 덱)
비선형 구조(트리 그래프)
파일 구조

//@@.uc State
GotoState('BLPlayerWalking');
GotoState(LandMovementState); <- State 이름변화에 대응하기 위한 변수 처리

//@@.h 파일을 따로 정의하고 .uc, .cpp 에서 static 함수로 만들기
ex> class'ABLUtils'.static.@#$%!@#$();     - .uc static 호출 법

static native function SetSettingsDataFloat(out SettingsData Data,float InFloat);
위의 방식대로 .uc에 작성하면 .h 에는
void SetSettingsDataFloat(struct FSettingsData& Data,FLOAT InFloat);
.uc 에서만 static 호출이 가능하고 native 에서는 static 호출이 불가능

그래서 아래와 같은 두 가지 방법을 취하여 .uc 뿐 아니라 native 에서도 static 으로 호출할 수 있게...
//1.////////////////////////////////
// .uc -> .cpp
// noexportheader : .h 에 Export(함수의 선언을) 하지 않는다.
static native noexportheader function LoadAllAssets();


case 1:
cpptext
{
    static void LoadAllAssets();//static 의 유무로 .uc 뿐만 아니라 native에서도 static 가능
};
.cpp 에 void LoadAllAssets() 함수 작성


case 2:
#include "!$@#%.h" 에 선언을 하여 static 함수로 사용
static void LoadAllAsset();

//2.///////////////////////////////
//위 1.의 방법보다 .uc 를 사용하는 방법으로는 정석
//native에 작성된 .uc의 A()에 해당하는 함수를 호출한다.

//.uc
static native function A();

cpptext
{
    static void StaticA();//static 의 유무~
}

//.cpp
A()
{
    StaticA();
}

void StaticA()
{ }
///////////////////////////////

//@@키맵핑
OnlineKeyEventBinder.uc(.cpp)    <- 키맵핑

//@@ GameString
//GameString에 있는 gamestring_code_name에 따른 반환 되는 값
Class SystemMessageParamValueData;
struct transient SystemMessageParamValueData
{
    var init string stringValue;      // string, Originally
    var double numberValue;       // double, Originally
};

.uc
string 받기(string Title)
{
    local string Ret;
    local array Params;

    class'ABLUtils'.static.Add_GameString_Param_String(Params, Title);

    if (IsComplete)
    {
        Ret = class'GameStringInfo'.static.FormatStringWithCodeName( "QuestAlert_Objective_Complete", Params);
    }
}

//@@ Text UI : class'ABLUtils'
String MymenuName = "닫기";
MymenuName = class'ABLUtils'.static.MakeAlignTag(MymenuName, "Right");
TextColor = MakeColor(0, 0, 255);
MymenuName = class'ABLUtils'.static.MakeFontTag_Param_Color(MymenuName, TextColor); 

//@@ Particle Effect
void ABLPlayer::MyEffectStart()
{
    FString BoneName;
    INT iRand = appRand() % static_cast(Mesh->SkeletalMesh->RefSkeleton.Num());
    //iRand = Rand(mesh.SkeletalMesh.RefSkeleton.Length); .uc에서 Bone 개수 구하기
    if(Mesh  != NULL && Mesh->SkeletalMesh != NULL)
    {
        if(Mesh->SkeletalMesh->RefSkeleton.IsValidIndex(iRand) == TRUE)
        {
             BoneName = Mesh->SkeletalMesh->RefSkeleton(iRand).Name.ToString();
        }
        else
        {
            BoneName = TEXT("");
            //*(FName*)(NAME_None);
        }
    }

    if(TargetingPSC != NULL)
    {
        MyEffectStop();
    }

    UBLGameRes* GameRes = ABLGameInfo::GetDefaultGameResource();
    UParticleSystem* pPaticleSystem = GameRes ? GameRes->TargetingVFX : NULL;
    if(pPaticleSystem != NULL && WorldInfo && WorldInfo->MyEmitterPool && Mesh != NULL)
    {
        TargetingPSC =  WorldInfo->MyEmitterPool->SpawnEmitterMeshAttachment(pPaticleSystem, Mesh, *BoneName);
    }
    if(TargetingPSC != none)
    {
        TargetingPSC.SetDepthPriorityGroup();//SDPG_Foreground Default는 World
    }
}


void ABLPlayer::MyEffectStop()
{
    if(TargetingPSC != NULL)
    {
        TargetingPSC->DeactivateSystem();
        TargetingPSC->KillParticlesForced();
        TargetingPSC = NULL;
    }
}

//@@ .uc worldinfo 에서 Pawn 전부 탐색 (원하는)
local BLNpc P;
foreach WorldInfo.AllPawns(class'BLNpc', P)//Npc만 나옴 원하는 클래스만
{
    if(P != @$)
    ...
}

//@@ SkillIfo
UPCSkillInfo* PCSkillInfoPtr = UPCSkillInfo::FindPCSkillInfo(cid);

//@@ ContentInfo BLContent Builder, xml, xsd
...\depot\trunk\gamma\BLServer\Tools\ContentBuilder\BLContentBuilder.exe
BLContentBuilder에 XSD 탭 보이는 법 Ctrl + F8 - XSDOPEN

DATA 탭
기획자분들이 준 Sheet를 xml로~ (Guild.xlsx -> GuildIfo.xml)
XSD 탭
스키마 변경(XSD, Mapping 파일 둘다 수정)

~수정 후 컨텐츠 빌드~

Development\Src\BLShare\... 폴더의 내용들은 BLContent Builder 를 통해 생성되는 것들
수정해야 할 것들은 U 가 붙어 있는 클래스의 읽는 함수 부분 없다면 클래스 생성
(BLGameContentInfoGlobalIncludes.h 매크로들 보기)

ContentInfo Key 유무에 따른 주의 사항
Key O
Key X
BLGameContentInfoGlobalIncludes.h 에 GetPtrData() 부분을 맞게 추가

//@@ 일반유저 계정 만들기
AuthServer 에 명령어 입력
adduser [ID] [Level]

//@@ Shelve - Unshelve
Shelve - P4V Pending 탭에서 바뀐 목록들을 선택 후 Shelve
Unshelve - P4V Pending 탭에서 Shelved Files 의 UnShelve Files 를 누르면 적용

//@@ 명령어들
Show Collision
ShowDebug @!# 등..
Stat FPS, Bless 등
Ghost, Walk

//@@ 마우스좌표얻기
UBlessLocalPlayer* LP = GetLocalPlayer();
FVector2D MousePosition;
MousePosition = LP->ViewportClient->GetMousePosition();

//@@ 디버그 출력
debugf(TEXT("***** OnChangeFocus : %d *****"), INT(focus_type));

//@@ 스크립트 빌드 퍼포스 포트 번호 설정
E:\Bless\main\depot\trunk\gamma\BLGame\Config\BLEditorUserSettings.ini

//@@ 코드사이닝
\\gms-bless-gw
gwtoext 내->외
exttogw 외->내
gencs.ds.neowiz.com