16일째: 풍선에서 배우기 및 단체 ID

이 글은 어드벤트 달력'[VCD] 테마파크 만들어.의 16일째 기사다.

이번 내용


이번에는 위아래로 움직일 수 있는 풍선을 아래 버튼으로 만들려고 합니다.
UP용 버튼을 누르면 위로 가속되고, DOWN용 버튼을 누르면 아래로 가속된다.양을 누르면 속도가 빨라진다.

이번에 배운 기술은 다음과 같다.
・JOINT
그룹 ID
※ 이번에 제작된 코드가 많아 제대로 작동하지 않습니다.다음 보도에서 다기능판으로 수정될 예정이다

풍선과 버튼을 함께 움직이는 방법


이번에는 버튼으로 풍선의 위아래 이동을 제어하려고 하기 때문에 버튼은 풍선과 함께 따라가야 한다.
함께 움직이려는 물체가 기능이 없으면 열기구의 하위 대상으로 함께 움직인다.
하지만 이번 상황에서 버튼을 하위 대상으로 삼으면 UP 버튼을 눌렀든 DOWN 버튼을 눌렀든 잡을 때 온우즈에 들어간 이름이 열기구 이름이 돼 어느 버튼을 눌렀는지 분간할 수 없다.
따라서 버튼은 열기구의 하위 객체가 아닌 별도의 SubItem으로 만들어야 합니다.
위에서 말한 바와 같이 독립된 SubItem을 함께 이동하고 싶을 때 JOINT의 기능은 매우 유용하다.자세한 내용은 아래 공식 페이지를 참조하십시오.
Joint (UnityComponent)
나는 주로 어디에 버튼을 설치할지 생각할 때 자주 사용한다.

Unity의 JOINT 설정


이번에는 상대 위치를 고정하고 이동하기 위해 FixedJoint를 사용합니다.
우선 지금까지의 절차에 따라 풍선과 UP용 버튼, DOWN용 버튼을 제작한다.

이렇게 하면 같이 움직일 수 없기 때문에 JOINT을 설정합니다.
두 개의 단추 대상을 선택하고 Inspector의ddComponent에 "FixedJoint"를 추가합니다.
그리고 FixedJoint 항목이 추가되었기 때문에 맨 위에 있는 ConnectedBody(어떤 대상에 맞추어 이동할지 설정)에서 풍선의 Subitem에 대해 D&D를 진행합니다.
다른 설정도 있지만, 함께 활동만 한다면 할 필요가 없다.
설정 후 아래와 같다.

그룹 ID 설정


Joint의 설정은 위에서 설명한 바와 같지만, 현재 상태에서 다른 사람이 단추를 눌렀을 때 풍선은 움직이지 않습니다.
버튼 자체는 잡을 때 소유권이 넘어가지만 풍선이 잡히지 않아 소유권이 넘어가지 않는다.
이러한 문제를 해결하기 위해 그룹 ID 기능을 사용합니다.자세한 내용은 아래 공식 페이지를 보십시오.
소유권과 이벤트 함수의 관계
쉽게 말하면 여러 개의 SubItem은 항상 같은 사람에게 소유권을 부여하는 기능이다.
그룹 ID의 설정은 Subitem 섹션에 있습니다.
이번에는 풍선과 두 버튼에 그룹 ID의 1을 설정했다.

코드 생성


JOINT 및 그룹 ID 자체에는 스크립트가 필요 없습니다.
버튼을 누르면 위아래 속도를 바꾸는 부분과 속도에 따라 풍선의 위치를 바꾸는 부분 두 가지 처리가 있으니 적어주세요.
(이번 내용과 무관한 처리는 생략하였습니다.)
우선 버튼에 따라 속도를 바꾸는 부분이다.
여기에는 특별히 새로운 내용이 없기 때문에 매우 간단하다.
--気球の速度。+だと上に、-だと下に進む。
local BalloonSpeed = 0

function onUse(use)
  if use == "Button_Balloon_Up" then
    BalloonSpeed = BalloonSpeed + 1
  end
  if use == "Button_Balloon_Down" then
    BalloonSpeed = BalloonSpeed - 1
  end
end
다음은 속도에 따라 풍선의 위치를 바꾸는 부분이다.
바닥을 뚫지 않기 위해 좌표가 0 이하일 때 수정 처리도 했다.
function updateAll()
  local balloon = vci.assets.GetTransform("HotAirBalloon")
  --バルーンの所有権を持っていたら
  if balloon.IsMine then
    --移動先の座標を算出する。0.01の部分は調整用の係数で、実際の動きを見ながら適切な値を設定。
    local nextPos = balloon.GetPosition()+Vector3.up*BalloonSpeed*0.01

    --移動先の座標が地中(y<0)なら地上で停止させるにする。(地中に埋まらないようにする処理)
    if nextPos.y < 0 then
      nextPos.y = 0
      BalloonSpeed = 0
    end

    balloon.SetPosition(nextPos)
  end
end
완성

끝맺다


어때요?
이번 방법은 사람마다 속도 정보가 있기 때문에 여러 사람이 버튼을 만지면 속도가 유지되지 않는다.
다음 STATE를 사용하여 이러한 문제를 해결하고 싶습니다.

좋은 웹페이지 즐겨찾기