Perforce

 

퍼포스 워크스페이스 설정

바이너리 모드로 접근하는 vi -b <파일명> 을 통해 확인할 수 있다.

만약 Line ending 을 잘못 설정하였으면 맥에서 다음과 같이 ^M 이 도배되어있는것을 확인할 수 있다.

 

 Bad Interpreter (위의 워크스페이스 설정을 하지 않아 Bad Interpreter 오류가 발생할 때)

.command 나 .sh 파일 실행 시, bad interpreter: No such file or directory 라는 에러가 발생할 때가 있는데 이는 유닉스 개행문자와 도스 개행문자가 섞여있는 경우 ^M 문자가 나타나서 발생하는 오류이다. (줄 바꿈을 의미하는 개행문자가 다름)

\r\n is a Windows Style

\n is a POSIX Style

/r is a old pre-OS X Macs Style, Modern Mac's using POSIX Style.

이 ^M을 제거하기위해서는 몇몇 방법이있지만 가장 쉬운방법은 dos2unix 라는 패키지를 설치하는 것이다.
 

dos2unix를 설치한 뒤에, mac2unix <파일명> 를 하면 변환되고 다시 vi -b <파일명> 를 하였을 시, ^M이 제거되어 있으면 성공

 
하위폴더 모두 적용하려면 해당 폴더로 이동한 다음에

find . -name "*.sh" -exec mac2unix {} \; 입력 

find . -name "*.command" -exec mac2unix {} \; command 파일도 마찬가지

만약 워크스페이스를 잘 못 받았으면 모든 파일 mac2unix 적용해야 함

find . -print -exec mac2unix {} \; - 현재 경로에서 하위 모든 파일 및 폴더 mac2unix 로 변경

 

 

맥 환경설정

 

복붙 시, 따옴표 치환 현상

맥 OS 의 기본 환경설정으로 인하여 따옴표를 복붙할 때, 여러가지 종류의 특수문자로 자동 치환되는 스트레스 받는일이 일어날 수 있다.
 

시스템 환경설정 - 키보드 - 텍스트 에서 큰 따옴표 / 작은 따옴표 각각 가장 밑의 거 (가장 따옴표 같이 생긴 것) 으로 바꿔주면 따옴표를 복붙하여도 자동 치환되지 않는다.

 

다음에서 다운로드한 앱 허용 - 모든 곳

기본적으로 맥은 App Store 나 확인된 개발자가 아니면 계속 확인 메세지 창이 뜬다.

cmd에 다음 명령어를 입력하면 모든 곳에서 다운로드 한 앱이 허용 된다.

 

sudo spctl ——master-disable

 

 

Terminal (CMD)

 

맥 패키지 매니저 brew 설치 후 인식안될 때

zsh: command not found: brew

이 오류는  오류 메시지가 나오면 Homebrew가 /usr/local/... 가 아닌 /opt/homebrew/ 에 설정되어 있어서 그렇다.
 
해결 방법은

vi ~/.zshrc

로 들어가서

export PATH=/opt/homebrew/bin:$PATH

를 작성해주고,  ESC와 :wq를 누르고 엔터를 치면된다.
그리고

source ~/.zshrc

source - 현재 쉘에서 전달된 파일의 내용을 실행하는 명령어 / 다른 bash script를 import하는 행위를 source

 

스크립트 더블클릭 실행

.command - 터미널 쉘 스크립트

.sh - 쉘 스크립트

.command 더블클릭하여 실행하면 .sh 파일이 실행 됨
단, .command파일을 만든 다음에 유저에게 실행권한 chmod 744 을 주어야 더블클릭 실행 됨

 

파일이나 폴더의 소유자에 관하여

어떤 명령은 해당 파일의 Permission denied 나 Authroization 문제가 발생할 때가 있다.
→ 소유자가 User가 아니라 Group 으로 되어있는 파일들이 있기 때문
 
Permission 관련이나 Authroization 에러가 뜨면 밑의 명령어 실행
→ Engine 폴더 자체에 그룹에게 실행권한을 주어야 권한이 생김

chmod -R 774 Engine

 

-R 옵션 - 하위 디렉터리를 포함하여 디렉터리 내부의 모든 파일의 접근 권한을 변경
(User / Group / Other) - Group 에게 실행 권한이 있어야 함

 

command not found

$PATH - 동작시킬 명령어의 위치 / 해당 파일의 디렉토리까지 이동하지 않고 어디서나 접근하기 위해 사용
 
예를 들어, 맥에 Helix Command-Line Client (P4) 를 설치하고 cmd 에서 p4를 쳐보면 command not found 라고 뜰 수 있는데 이는 PATH 에 P4 의 경로가 포함되어있지 않기 때문이다.

<사용자>$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands

따라서
P4 의 실행 파일을 경로에 추가해 주거나,
기존에 $PATH 에 P4 실행파일을 넣어서
해결할 수 있다.
 
 
/etc/paths 파일을 수정하여 해당 실행파일의 경로를 입력하거나
/usr/local/bin 경로는 이미 $PATH 에 포함되어있으므로 여기 안에 넣는 방식도 있다.

하지만 또 젠킨스 ssh-agent에서는 이를 인식하지 못하니 풀 경로로 입력해주어야 인식한다. p4 - command not found

/usr/local/bin/p4

 

 

언리얼

 

언리얼 에디터 실행 시 Mac / iOS 둘 다 Assertion Failed

[/Script/Engine.RendererSettings]
r.GPUCrashDebugging=False

위의 옵션이 True일 경우 맥OS에서 에디터를 실행할 시, Assertion Failed 오류가 발생한다. 이유는 모름

 

(DDC 공유폴더 사용 시) 프로젝트 실행마다 쉐이더 컴파일러 다시 하는 문제

맥에서 공유 폴더에 접근이 되지 않을 때 프로젝트를 킬때마다 계속 쉐이더 컴파일러를 다시 빌드한다.
[ProjectDirectory]/Config/DefaultEngine.ini 에서 DerivedDataBackendGraph 쪽을 살펴보면

[DerivedDataBackendGraph]
MinimumDaysToKeepFile=7
Root=(Type=KeyLength, Length=120, Inner=AsyncPut)
AsyncPut=(Type=AsyncPut, Inner=Hierarchy)
Hierarchy=(Type=Hierarchical, Inner=Boot, Inner=Pak, Inner=EnginePak, Inner=Shared)
Boot=(Type=Boot, Filename=%GAMEDIR%DerivedDataCache/Boot.ddc, MaxCacheSize=256)
Shared=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, DeleteUnused=true, UnusedFileAge=19, FoldersToClean=-1, Path=<공유DDC 경로>, EnvPathOverride=UE-SharedDataCachePath)
Pak=(Type=ReadPak, Filename=%GAMEDIR%DerivedDataCache/DDC.ddp)
EnginePak=(Type=ReadPak, Filename=../../../Engine/DerivedDataCache/DDC.ddp)

Shared 라인에서 맥에서 공유폴더 접근 못함에 따라 DDC 경로가 없다고 판단하여 쉐이더 컴파일을 계속 다시 시도한다.
 

Engine/Config/BaseEngine.ini

Engine/Config/[Platform]/[Platform]Engine.ini

[ProjectDirectory]/Config/DefaultEngine.ini

[ProjectDirectory]/Config/[Platform]/[Platform]Engine.ini

[ProjectDirectory]/Saved/Config/[Platform]/Engine.ini → 얘는 플랫폼 차이점 저장하는 곳이라고 한다.
순으로 설정을 덮어 씌우기 때문에

Config/Mac/MacEngine.ini 파일에서 다음과 같이 수정

[DerivedDataBackendGraph]
Shared=(..생략, Path=<로컬 DDC 경로 / 혹은 접근 가능한 공유 DDC 경로>, EnvPathOverride=UE-SharedDataCachePath)

 

FSocket 관련 IPv4 -> IPv6 주소 변환

 언리얼에는 IPv6 Address 에 대한 구조체가 따로 없다.

 

Socket = FTcpSocketBuilder(TEXT("TcpSocket"))
    .AsBlocking()
    .AsReusable()
    .BoundToAddress(FIPv4Address::Any)
    .BoundToPort(0)
    .WithSendBufferSize(SEND_BUFFER_SIZE)
    .WithReceiveBufferSize(RECV_BUFFER_SIZE)
    .Build();

 

 TcpSocketBuilder로 만들어진 FSocket 의 프로토콜을 확인하는 함수가 있는데

Socket->GetProtocol()

왜 인진 모르겠지만 Window / Android / Mac 에서 모두 IPv4 프로토콜이 나오고 IOS 에서만 IPv6 프로콜을 출력하였다.

 

이 Socket에 IPv4 주소를 Connect 시키려고 하면 IOS 에서는 다음과 같은 경고문이 뜨면서 연결이 실패된다.

LogSockets: Warning: Tried to connect with an address with protocol IPv4 using a socket with protocol IPv6

 

IPv4 주소로 IPv6 프로토콜을 사용하려고 해서 문제라 한다.

 

그래서 다음과 같이 IPv6 형식으로 바꾸어 주어야 한다.

// 생략
if (Socket->GetProtocol() == FNetworkProtocolTypes::IPv6)
{
    ServerAddress = ConvertIPv4ToIPv6(ServerAddress);
}


// IPv4 -> IPv6 변환 함수
FString FTcpClientWorker::ConvertIPv4ToIPv6(const FString& IPv4Address)
{
    FIPv4Address ParsedIPv4Address;
    // Validate the input IPv4 address
    if (!FIPv4Address::Parse(IPv4Address, ParsedIPv4Address))
    {
        // Invalid IPv4 address format
        return FString(TEXT("Invalid IPv4 address"));
    }

    // Convert IPv4 to IPv6 format
    FString IPv6Address = FString::Printf(TEXT("::ffff:%04x:%04x"),
        ParsedIPv4Address.A * 256 + ParsedIPv4Address.B,
        ParsedIPv4Address.C * 256 + ParsedIPv4Address.D);

    return IPv6Address;
}

 

ChatGpt 말로는

IPv6 주소의 경우 주소의 각 세그먼트에 있는 앞에 오는 0은 선택 사항이므로 생략할 수 있습니다. IPv6에서는 이중 콜론(::)을 사용하여 연속된 제로 세그먼트 그룹의 약어를 허용합니다. 이중 콜론은 하나 이상의 연속된 0 그룹을 나타냅니다

 

 주소 변환언리얼 HTTP 관련

주소만 적혀져 있으면 윈도우에서는 http를 붙여서 보내준다는데 맥에서 사용할때는 http://를 명시적으로 붙여주어야 한다.
또한 .ini 파일에서 한 줄 주석처리 # ; 말고도 // 도 한 줄 주석처리가 된다.
따라서 // 가 들어가있는 문자열은 " "로 묶어 주어야 한다.

 

Mac / iOS 기기 로그 보는 방법

command + space bar
spotlight 에서 console.app 실행하여 해당 디바이스 선택 후 , 시작 누르면 로그 얻을 수 있음
예를 들어 Moon.app을 실행한 뒤, 얻어진 로그에서 Moon 검색

 

패키징한 앱이 Finder 에서 뜨지 않을 때

Plist 란?  ->  Mac/IOS 의 환경 설정 파일

 
UIFileSharingEnabled 앱이 파일을 공유하는지 여부
프로젝트 세팅 - IOS - Extra Plist Data
AdditionalPlistData=<key>UIFileSharingEnabled</key>\n<string>YES</string>

기존에 DefaultEngine.ini 에 PList 가 다음과 같이 쓰여져있었는데,

(Shpping) 앱 스토어에 제출한 릴리스에서 작동하려면 키가 다음과 같아야 한다고 한다.

AdditionalPlistData=<key>UIFileSharingEnabled</key>\n<true/>

 

 

XCode

 

XCode 버전 변경

xcode-select -p 현재 XCode 버전 확인

xcodebuild -showsdks XCode 에 설치된 SDK 확인

XCode-preference-Location 에서 Command Line Tools 에서 바꿀 수도 있고

터미널에서 sudo xcode-select -s /Applications/<XCode이름>.app/Contents/Developer/ 으로도 바꿀 수 있다.

 

위 과정이 귀찮으면 xcodes 라는 앱을 사용하면 훨씬 편하다

https://www.xcodes.app/

 

XCode 단축키

command + Shift + O 프로젝트 내 파일 / 클래스 / 함수 검색
command + Shift + J 현재 열린 파일 파일 탐색기? 에서 바로 펼쳐 줌
command + Y 현재 프로젝트 모든 브레이크 포인트 활성화 / 비활성화
control + command + J 함수 정의로 이동 (XCode Unreal 에서 동작 X)
control + command + Y 다음 중단 점 (VS F5)
F6 다음 라인 (VS F10)

 

XCode 디버깅

중단점 찍으면 오른쪽 하단에 lldb가 생기는데 FString 같은 언리얼의 문자열을 디버깅 하려면 추가 명령어가 필요하다
command script import "/Users/유저이름/프로젝트경로/Engine/Extras/LLDBDataFormatters/UEDataFormatters.py"
command script import "/Users/유저이름/프로젝트경로/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py"​
매 디버깅 시 마다 입력해주어야 한다.
 
po breakpoint 기점으로 변수에 어떤 값이 저장되어있는지 알 수 있음
 

 

 

XCode 기기 연결해도 안뜰 때

해당 기기 추가

 

 

 

 

Generate project Files 관련

맥에서 Generate Project Files를 하면 xcworkspace 프로젝트를 다시 생성하는데 XCode에서 세팅한 모든 정보가 초기화가 된다.

그래서 보통 IOS에 카메라 / 구글 권한등을 설정해주는 Plist 도 ini 파일에다가 추가해주는 식으로 되어있다.

[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
AdditionalPlistData=

 

그리고 잘 되던 인증서가 갑자기 에러를 뱉는 경우가 있다. 

이 경우 Build Settings 에서 Code Signing Entitlements를 다 없애주면 된다.

10개 모두 지워줌

xcworkspace 에서 세팅할 생각 x 보통은 ini에 설정하는 부분이 있다.

 

 

 

XCode16 에서 부터 MobileProvisioning 경로 바뀜

 

XCode에서 인증서를 다운받기 누르면

기존 경로는  ~/Library/Developer/Xcode/UserData/Provisioning Profiles 에 다운받아지는데

16 부터 ~/Library/MobileDevice/Provisioning Profiles 에 다운받아진다

 

심볼릭 링크로 연결 해주어야 한다

ln -s [원본 경로] [링크 경로]

ln -s ~/Library/Developer/Xcode/UserData/Provisioning\ Profiles ~/Library/MobileDevice

Provisioning Profiles 폴더가 심볼릭 링크여야 한다 (폴더 있는상태로 ln 명령어 하면 File Exists 뜨니 Procisioning Profile 폴더 삭제하고 명령어 실행)

'언리얼 > Mac | iOS' 카테고리의 다른 글

Mac 엔진 5.2 -> 5.3 마이그레이션 발생 문제  (2) 2024.01.23
TestFlight  (1) 2024.01.09
Google Protobuf 언리얼에 적용시키기 (Mac / IOS)  (0) 2023.12.22
ssh key / Mac OS 에 ssh 접근  (0) 2023.05.31
Apple Developer  (0) 2023.05.28

+ Recent posts