14일째: 돌루스에서 학습 대상의 생성과 삭제(후편): 삭제

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

이번 내용


이번에도 지난번과 마찬가지로 밀로스를 만들면서 다음과 같은 내용을 배운다.
・bone와의 충돌 탐지
객체 삭제

소유권에 대한 대응


충돌 판정을 받은 onTriger Enter on Collision Enter


이번에는 돌로즈를 먹으면 사라지는 행위를 실현해야 한다.
'먹었다'를 어떻게 판단하는지에 관해서는 사람의 머리에 헤드라는 born이 있기 때문에 그 born이 초콜스의 균형기에 부딪히면'먹었다'로 판정된다.
onTriger Enter Enter onCollision Enter를 사용하여 객체 충돌을 가져옵니다.
자세한 내용은 아래 공식 페이지를 보십시오.
이벤트 함수
그리고 예전에 본과 충돌 판정 시 호출된 함수에 대한 기사를 썼는데 보십시오.
Trigger 및 Kinematic 정보
onTrigger Enter onCollision Enter는 첫 번째 매개변수와 객체 SubItem 이름, 두 번째 매개변수가 충돌한 후의 이름을 가질 수 있습니다.
첫 번째 매개변수는 SubItem의 하위 객체이며 두 번째 매개변수는 균형기가 실제로 설정된 객체 이름입니다.

Unity 설정


이 같은 맥락에서 돌로즈가 헤드본에 닿으면 사라지는 처리가 이뤄진다.코드를 만들기 전에 Unity에서 설정을 변경합니다.수정점은 다음 세 가지입니다.
  • 이퀄라이저 레이어를 VIAccessory로 설정
  • 내용상 VIItem이나 VCSIPick Up으로 여겨지기 쉬우나 사람의bon이 속한 HumanoiidParts와의 충돌 판정이 없다(아래 그림 참조).따라서 VIAccessory를 마스터와 충돌하도록 설정합니다.Location과default 등은 아마 상관없을 거예요.
  • grabbable 닫기
  • 이번에 스크립트에서 SubItem 사이즈를 변경하는 처리가 있었지만, grabbable가 ON일 경우 쥐고 있는 상태에서 스크립트에서 사이즈를 변경할 수 없습니다.(이것은 글을 쓸 때의 행동입니다. 오류가 발생할 수 있기 때문에 변화가 발생할 수 있습니다.)
  • isTrigger 열기
  • 이번에는 돌로스를 물리적으로 부딪칠 필요가 없기 때문에 콜리더의 isTrigger가 ON으로 바뀌었다.벽이나 사람과 부딪치려면 isTrigger를 닫으십시오.이 경우 충돌 시 onCollisionEnter로 이동합니다.

  • 이제 Unity 설정이 종료됩니다.

    코드 생성


    공식 페이지를 참고하여 구상한 처리를 다음과 같이 직접 조합한다.
    function onTriggerEnter(item,hit)
      --名前にChurrosを含むSubItemがHeadボーンにあたったら
      if string.find( item, "Churros_" ) and hit=="Head" then
        local churros = vci.assets.GetTransform(item)
        -- 削除(y座標-500に移動)
        churros.SetPosition(Vector3.__new(0,-500,0))
      end
    end
    
    하지만 위 코드로 잡아먹으면 손에서 사라지지 않는다.
    VCD가 잡고 이동할 때도 잡고 있다는 판정이 남아있기 때문에 이동 전 위치로 되돌려놓는다.
    위와 같은 문제를 해결하기 위해'승선보스를 만났을 때 보이지 않는다'→'손을 놓을 때 -500으로 이동'2단계로 변경해 처리한다.
    보이지 않는 수단
    • 재료를 투명하게 하다
    • 보이지 않을 정도로 사이즈 축소
    잠깐만요.
    이번에는 후자의 방법으로 대응한다.
    우선bon에 맞았을 때의 코드는 다음과 같이 수정한다
    function onTriggerEnter(item,hit)
      --名前にChurrosを含むSubItemがHeadボーンにあたったら
      if string.find( item, "Churros_" ) and hit=="Head" then
        local churros = vci.assets.GetTransform(item)
        -- [追加部分]サイズを1/1000にする
        churros.SetLocalScale(Vector3.one*0.001)
        -- 削除(y座標-500に移動)
        churros.SetPosition(Vector3.__new(0,-500,0))
      end
    end
    
    치수를 0으로 설정하면 잘못된 동작이 있을 수 있으므로 0이 아닌 작은 값으로 설정합니다.
    못 잡은 상태에서 먹을 때도 있기 때문에 -500으로 이동하는 전선은 그대로 두고 있다.
    방출을 만들 때 - 500 처리로 이동합니다.
    ---[not SubItemの所有権&Grab状態]アイテムをUngrabしたときに呼ばれる。
    ---@param target string @UngrabされたSubItem名
    function onUngrab(target)
      if string.find( target, "Churros_" ) then
        local churros = vci.assets.GetTransform(target)
        -- 放した際にチュロスのサイズが0.5以下になってたら
        if churros and churros.GetLocalScale().y < 0.5 then
          local churros = vci.assets.GetTransform(target)
          churros.SetPosition(Vector3.__new(0,-500,0))
        end
      end
    end
    
    0.5라는 수치는 매우 적합하다.1/1000~1의 수치면 뭐든지 될 것 같아요.
    마지막으로 처리 부분에 되돌아오는 코드를 추가하면 완성됩니다
    function AppearChurros(sender, name, churrosName)
      local churros = vci.assets.GetTransform(churrosName)
      -- オブジェクトが取得できていて、かつ所有権を持っている場合のみ処理実行
      if churros then
        if churros.IsMine then
        --対象のオブジェクトを出現ポイントの位置に移動させる
          local appearPoint = vci.assets.GetTransform("Churros_AppearPoint")
          churros.SetPosition(appearPoint.GetPosition())
          churros.SetRotation(appearPoint.GetRotation())
          --[追加部分]サイズを1にする
          churros.SetLocalScale(Vector3.one)
        end
      end
    end
    vci.message.On("appearChurros", AppearChurros)
    
    이상 대응 종료.이렇게 하면 아래처럼 잡을 때와 안 잡을 때 다 먹을 수 있어요.

    끝맺다


    어때요?
    이번에는 한 입에 사라지기 위해 했는데 신경 쓰면 두 입, 세 입이면 사라지는 걸 만들 수 있을 것 같아.
    다음 내용은 미정이다.

    좋은 웹페이지 즐겨찾기