본문 바로가기

리뷰&생각

챗지피티를 활용하여 인터랙티브한 로블록스 월드 만들기 샘플

로블록스를 다시 조금씩 만져보고 있습니다. 예전에는 루아 코딩을 하려고 책도 사고, 유튜브도 보면서 코딩 연습을 했습니다. 그러나 지금은 코딩 전담 파트너가 생겼기에 협업을 해보기 위해 테스트 중입니다. 바로 챗지피티를 파트너로 고용했습니다. 무료 버전으로도 잘 되는지 테스트를 해 보았습니다. 결론은 잘 됩니다. 

 

 

로블록스로 월드를 만드는 것은 로블록스 스튜디오 사용법을 배운 후에 잘 조합하면 됩니다. 이것은 정적인 월드이기 때문에 재미가 덜 합니다. 재미를 넣기 위한 기초 작업으로 월드에 인터랙티브 요소를 넣어야 합니다. 추가할 요소는 아래와 같습니다.

 

1. 밟으면 체력이 차감되는 블록

2. 밟으면 체력이 증가하는 블록

3. 부딪히면 사라지는 블록

4. 밟으면 다른 곳으로 텔레포트하는 블록

5. 물리 속성을 없애서 그냥 통과하는 블록

 

대략 이정도만 넣어도 월드에 각 속성을 붙여 약간의 재미 요소를 넣을 수 있습니다. 어떻게 하는지 하나씩 살펴보겠습니다.

 

역할 부여

챗지에게 로블록스 코딩하는 역할을 부여합니다. 

 

1. 밟으면 체력이 차감되는 블록

 

아래 스크립트를 블록에 적용하면 체력이 차감됩니다. 체력 차감되는 정도를 바꾸고 싶다면 숫자만 변경하면 됩니다. 즉시 죽게 하고 싶으면 -100으로 하면 되겠죠.

 

``` 코드```

local block = script.Parent  -- 이 스크립트가 포함된 블록을 참조합니다.

local function onTouch(other)
    -- 플레이어가 블록에 닿았는지 확인
    local player = game.Players:GetPlayerFromCharacter(other.Parent)
    if player then
        -- 플레이어의 체력 차감
        local character = player.Character
        local humanoid = character:FindFirstChildOfClass("Humanoid")
        
        if humanoid then
            humanoid.Health = humanoid.Health - 5  -- 체력을 -5 차감합니다.
        end
    end
end

-- Touch 이벤트 연결
block.Touched:Connect(onTouch)

```

 

 

2. 밟으면 체력이 증가하는 블록

 

이제 반대로 밟으면 체력이 3씩 증가하는 방법을 요청했습니다. 아래 코드를 붙여 넣으면 동작합니다.

 

``` 코드```

local block = script.Parent  -- 이 스크립트가 포함된 블록을 참조합니다.

local function onTouch(other)
    -- 플레이어가 블록에 닿았는지 확인
    local player = game.Players:GetPlayerFromCharacter(other.Parent)
    if player then
        -- 플레이어의 체력 증가
        local character = player.Character
        local humanoid = character:FindFirstChildOfClass("Humanoid")
        
        if humanoid then
            humanoid.Health = math.min(humanoid.Health + 3, humanoid.MaxHealth)  -- 체력을 +3 증가, 최대 체력 초과 방지
        end
    end
end

-- Touch 이벤트 연결
block.Touched:Connect(onTouch)

```

 

 

3. 부딪히면 사라지는 블록

 

플레이어와 부딪히면 사라지는 블록도 만들 수 있습니다. 점프맵을 만들면서 중간에 함정 처럼 블록을 숨겨 놓거나 할 때 사용하면 되겠죠. 코드는 아래와 같습니다.

 

``` 코드```

local block = script.Parent  -- 이 스크립트가 포함된 블록을 참조합니다.

local function onTouch(other)
    -- 플레이어가 블록에 닿았는지 확인
    local player = game.Players:GetPlayerFromCharacter(other.Parent)
    if player then
        -- 블록 제거
        block:Destroy()  -- 블록을 삭제합니다.
    end
end

-- Touch 이벤트 연결
block.Touched:Connect(onTouch)

```

 

 

4. 밟으면 다른 곳으로 텔레포트하는 블록

 

이번에는 블록을 밟으면 다른 곳으로 강제 이동시켜 버리는 텔레포트 기능을 만들어 보겠습니다. 이 경우 어디로 이동하게 할 것인가를 지정해야 하기 때문에 블록 이름을 TeleEnd라는 곳으로 가도록 했습니다.

 

``` 코드```

local teleportBlock = script.Parent  -- 이 스크립트가 포함된 블록을 참조합니다.
local teleEnd = game.Workspace:WaitForChild("TeleEnd")  -- 종착지 블록을 참조합니다.

local function onTouch(other)
    -- 플레이어가 블록에 닿았는지 확인
    local player = game.Players:GetPlayerFromCharacter(other.Parent)
    if player then
        -- 플레이어의 캐릭터를 찾기
        local character = player.Character
        if character then
            -- 캐릭터를 종착지로 텔레포트
            character:SetPrimaryPartCFrame(teleEnd.CFrame)  -- 텔레포트 위치로 이동합니다.
        end
    end
end

-- Touch 이벤트 연결
teleportBlock.Touched:Connect(onTouch)

```

 

만약 이런 기능을 여러 개 월드에 넣으려면 종착지 이름을 각각 설정하거나, 랜덤하게 이동하도록 수정할 수 있습니다.

 

```코드```

local teleportBlock = script.Parent  -- 이 스크립트가 포함된 블록을 참조합니다.

local function getRandomTeleEnd()
    local teleEnds = {}  -- 모든 TeleEnd 블록을 저장할 테이블

    -- Workspace에서 모든 TeleEnd 블록을 찾습니다.
    for _, obj in ipairs(workspace:GetChildren()) do
        if obj:IsA("Part") and obj.Name == "TeleEnd" then
            table.insert(teleEnds, obj)  -- TeleEnd 블록을 테이블에 추가
        end
    end

    -- TeleEnd 블록이 존재하는 경우 랜덤으로 하나 선택
    if #teleEnds > 0 then
        return teleEnds[math.random(1, #teleEnds)]
    else
        return nil  -- TeleEnd 블록이 없으면 nil 반환
    end
end

local function onTouch(other)
    -- 플레이어가 블록에 닿았는지 확인
    local player = game.Players:GetPlayerFromCharacter(other.Parent)
    if player then
        -- 플레이어의 캐릭터를 찾기
        local character = player.Character
        if character then
            local randomTeleEnd = getRandomTeleEnd()  -- 랜덤 TeleEnd 블록 선택
            if randomTeleEnd then
                -- 캐릭터를 랜덤한 TeleEnd 블록으로 텔레포트
                character:SetPrimaryPartCFrame(randomTeleEnd.CFrame)  -- 텔레포트 위치로 이동합니다.
            end
        end
    end
end

-- Touch 이벤트 연결
teleportBlock.Touched:Connect(onTouch)

```

 

 

5. 물리 속성을 없애서 그냥 통과하는 블록

 

이 경우 2가지로 할 수 있습니다. 코드를 작성해서 블록에 설정하는 방법과 블록의 속성 창에서 CanCollide 속성을 해제하는 방법입니다. 저는 스크립트를 사용해서 구현했습니다. 

 

 ```코드```

local passThroughBlock = script.Parent  -- 이 스크립트가 포함된 블록을 참조합니다.

-- CanCollide 속성을 false로 설정하여 플레이어가 블록을 통과하도록 합니다.
passThroughBlock.CanCollide = false

-- 필요에 따라 투명도를 설정하여 시각적으로도 통과할 수 있도록 만들 수 있습니다.
passThroughBlock.Transparency = 0.5  -- 0은 불투명, 1은 완전 투명

```

 

* * *

 

챗지피티 덕분에 이것저것 구현하는 난도가 확 낮아졌음을 느낍니다. 예전에는 진입하기 어려웠던 것들도 이제는 상대적으로 쉽게 해볼 수 있는 용기를 갖게 되었습니다. 챗지피티의 가장 큰 효력이 바로 이것입니다. 해 볼 수 있는 용기를 준 도구. 여러분들도 한번 용기를 가져보시기 바랍니다.