상자에서 먹는 비디오 CD를 꺼내는 방법

개시하다


어느 정도 음식 VCD를 실현하는 방법을 알면 이해하기 쉬울 것 같아서요.
몰라. 알 수도 있어.

이번에 하고 싶은 거.


아래와 같은 것은 처음에는 상자에 넣어서 안에서 꺼내 먹을 수 있는 VCD를 만든다.이번에는 예를 들어 단풍만두를 만들자.

주요 조건은 다음과 같다.
 1. 상자 안에 단풍만두가 들어 있는데, 상자가 움직이면 단풍만두도 따라서 움직인다.
 2. 상자에서 홍엽만두를 한 번 꺼내면, 상자는 움직여도 움직이지 않는다.
 3. 단풍만두를 먹고 손에서 사라져 상자로 돌아왔다
 4. 상자를 옮길 때 단풍만두는 뒤처지지 않아 보인다

실현 중인 과제


요점은 조건 1의 상자가 움직이면 단풍만두도 함께 움직인다.
나는 이 점에 대해 자세히 고려하고 싶다.

하위 객체의 위치 동기화


단순히 함께 움직일 뿐이라면 단풍만두를 상자 속의 아이 상대로 만들면 된다.
하지만 이번에는 단풍만두를 꺼내기 위해서는 SubItem이 필요합니다.
SubItem은 VCOIObject의 바로 아래에만 놓을 수 있기 때문에 상자의 하위 대상이 될 수 없습니다

스크립트의 SubItem 위치에서 동기화


다른 SubItem과 함께 이동하는 방법으로는 스크립트를 통해 동기화하는 방법이 있습니다.같은 사람이 상자와 단풍만두의 소유권을 가지고 있다면 거의 문제없을 것이다.
하지만 실제로 꺼내 먹으면 상자에 들어가기 때문에 다 먹은 단풍만두는 먹는 사람이 소유권을 가지는 상태가 된다.
이 상태에서 같은 기간 지연이 발생하고 단풍만두는 조금 늦어지며 요구4의 외관상 뒤처지지 않지만 만족할 수 없다.

해결책


상술한 문제를 해결하기 위해 이번에는 하위 대상과 스크립트를 동기화하는 혼합 방식을 채택하였다.
상자에 설치된 아이 대상자가 잡지 못하는 단풍만두(Fake 단풍)와 일반 단풍만두(Real 단풍)와 가시 상태를 전환해 자연스러운 동작처럼 보이도록 한다.

구체적인 절차는 다음과 같다.
· 상자에 들어갈 때 페이크 단풍은 가시화되고 리얼 단풍은 가시화되지 않습니다.
·리얼 단풍과 페이크 단풍의 위치가 동기화돼 다소 지연되지만 위치는 대체로 같다.
· 페이크 단풍을 이용하려면 같은 위치의 리얼 단풍을 잡는다.
· 리얼 단풍을 잡는 순간 페이크 단풍을 비시각화·리얼 단풍을 시각화한다.
· 리얼 단풍을 먹는 순간 페이크 단풍은 시각화하고 리얼 단풍은 시각화하지 않는다.

코드


구체적인 코드는 다음과 같다.
변수, 함수의 정의 등이 상당히 사랑스럽기 때문에 분위기 속에서 읽어보세요.복사도 안 하고.

장악적 처리

function onGrab(target)
  if string.find( target,NAME.MOMIJI ) then
     local no = string.match( target,NAME.MOMIJI.." (.+)" )
     if no then
      changeFakeToReal(no)
     end
   end
end

function changeFakeToReal(no)
  --箱から出てるフラグをONにする
  vci.state.Set(STATE.IS_TAKE_OUT.." "..no,true)
  --Fake用のもみじ饅頭を透過して、実物のもみじ饅頭を可視化する。
  vci.assets._ALL_SetMaterialColorFromName(NAME.MOMIJI.." "..no,COLOR.SHOW)
  vci.assets._ALL_SetMaterialColorFromName(NAME.FAKE.." "..no,COLOR.HIDE)
end

음식 처리

function onCollisionEnter(item, hit)
  if string.find(item,NAME.MOMIJI) and hit == "Head" then
    local momijiNo = string.match( item,NAME.MOMIJI.." (.+)" )
    if momijiNo then
      eatMomiji(momijiNo)
    end
  end
end

function eatMomiji(_no)
  local no = tonumber(_no)
  local item = ITEM.MOMIJI_LIST[no]

  if item and item.IsMine then
    --箱から出てるフラグをOFFにする
    vci.state.Set(STATE.IS_TAKE_OUT.." "..no,false)
    --Fake用のもみじ饅頭を可視化して、実物のもみじ饅頭を透過する。
    vci.assets._ALL_SetMaterialColorFromName(NAME.FAKE.." "..no,COLOR.SHOW)
    vci.assets._ALL_SetMaterialColorFromName(NAME.MOMIJI.." "..no,COLOR.HIDE)

    vci.assets._ALL_PlayAudioFromName(AUDIO.EAT)
  end
end

포지셔닝 처리

function updateAll()
  for i=1,#ITEM.MOMIJI_LIST do
    local item = ITEM.MOMIJI_LIST[i]

    --所有権がバラバラの可能性があるため各自所有権保持者が処理する
    if item.IsMine then
      -- 箱から出ていなかったら
      if vci.state.Get(STATE.IS_TAKE_OUT.." "..i) == false then
        --- Fakeもみじの位置にRealもみじを移動する。
        item.SetPosition(ITEM.FAKE_LIST[i].GetPosition())
        item.SetRotation(ITEM.FAKE_LIST[i].GetRotation())
      end
    end
  end
end
프레임당 위치를 조정할 필요가 없을 수도 있습니다.
그게 다야.

끝맺다


어때?
이번 방법은 음식 VCD 외에도 적용할 수 있을 것 같습니다.
또 VCD로 테마파크를 제작한다는 광고도 썼으니 꼭 가보세요.
  [VCC] 테마파크 만들기 Advent Calendar 2020

좋은 웹페이지 즐겨찾기