//@@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