VCD를 통해 여러 객체를 동시에 이동하는 세 가지 방법

8577 단어 VirtualCastVCI

개시하다


이 글은 VCI Advent Calendar 2019 20일째 되는 글이다.
이번에는 여러 종목을 함께 이동하고 싶을 때 3가지 방법을 알려드릴게요.

개요


다음은 몇 개의 대상을 하나의 전체로 이동하는 방법을 소개한다.
는 다음 이미지의 이미지입니다.

나는 주로 흩어진 제작 대상을 붙이거나 조작용 단추를 설치하는 데 쓰인다고 생각한다.
3가지 방법을 소개합니다.

① Unity에서 친자식으로 만들기


가장 간단한 방법입니다.다음은 Unity에서 친자 관계를 맺는 것입니다.

VCSitem 은 Parent1 에만 설정되어 있습니다.
부모 객체를 빈 객체로 만든 다음 그 아래에 여러 개의 자식을 작성할 수 있습니다.

장점


1. 인코딩되지 않음
2.신축성

결점


1. 어떤 대상이 성공했는지 분간할 수 없다
이 항목을 사용할 때, onUse 시스템의 함수 매개 변수에는 아들도 있고, 부모 대상의 이름도 있어서, 어느 대상이use인지 구분할 수 없습니다.
따라서 다른 작용이 있는 버튼 등을 들면 안 된다.
(onCollision·onTrigger 시스템의 함수인 target에도 하위 정보가 포함되어 있기 때문에 아래 펜처럼 다른 클릭 대상을 넣어서 피할 수 있다.)

② Joint로 연결


Unity FixedJoint를 통해 함께 이동하려는 객체를 연결하는 방법
Unity의 구성은 다음과 같습니다.각 Child에 FixedJoint를 추가하여 Connected Body의 프로젝트에 Parent 지정
(VCD의 Joint 설정에 대해서는 VirtualCast의 wiki

※ 차일드의 라이트바디의 Is Kinematic에 체크가 있으면 정상적으로 작동하지 않습니다

장점


1. 어떤 대상이use인지 분별할 수 있다
이 구성이라면 아이도 VCSitem을 추가할 수 있기 때문에use의 매개 변수로 아이와 부모를 구분할 수 있다
2. 비인코딩

결점


1. 확대/축소가 동기화되지 않음
FixedJoint로 객체를 연결할 때 거리는 고정된 것처럼 보이며 확대해도 객체의 폭은 고정되지 않습니다.
2.조금 늦게 이동·풀떨림
다음 이미지를 참조하십시오.잘하셨습니다.

그나저나 다른 사람의 관점에서 보면 좀 더 좋아 보인다.

③ 스크립트로 동기화


마지막으로 소개한 방법은 스크립트에서 위치, 회전, 확대율을 동기화하는 방법이다.
실현 방법은 몇 가지가 있는데 이번에는 동기화된 가상 대상의 방법을 채택한다.
좀 복잡하니까 자세히 설명해 주세요.
먼저 Unity의 구성은 다음과 같습니다.

포인트가 두 개예요.
• Parent 아래에 차일드 객체를 동기화하는 데 사용되는 의사 객체(빈 객체)를 설정합니다.
이 경우 가상 객체가 차일드와 같은 좌표에 설정됩니다.
• Parent 및 Child의 경로는 빈 객체이고 Size는 1입니다.
(이런 구조를 사용하면 치수 동기화가 수월합니다.)
다음에 동기화할 코드는 다음과 같다.
(원하지 않는 문법이 있으면 무시하세요.)
--利用しやすいようにGetSubItemして変数に格納しておく
local ITEMS ={
  PARENT = vci.assets.GetSubItem("Parent 3"),  
  CLILD_X = vci.assets.GetSubItem("ChildX 3"),
  CLILD_Y = vci.assets.GetSubItem("ChildY 3"),
  CLILD_Z = vci.assets.GetSubItem("ChildZ 3"),
  CLILD_X_DUMMY = vci.assets.GetSubItem("ChildX 3_dummy"),
  CLILD_Y_DUMMY = vci.assets.GetSubItem("ChildY 3_dummy"),
  CLILD_Z_DUMMY = vci.assets.GetSubItem("ChildZ 3_dummy"),
}
---毎フレーム位置同期を行う
function updateAll()
  moveChild(ITEMS.CLILD_X,ITEMS.CLILD_X_DUMMY)
  moveChild(ITEMS.CLILD_Y,ITEMS.CLILD_Y_DUMMY)
  moveChild(ITEMS.CLILD_Z,ITEMS.CLILD_Z_DUMMY)
end
--childの要素の位置・回転・拡縮をtargetに同期させる
function moveChild(child,target)
  child.SetPosition(target.GetPosition())
  child.SetRotation(target.GetRotation())
  child.SetLocalScale(ITEMS.PARENT.GetLocalScale()) --ココだけ参照しているオブジェクトが異なる
end
하위 대상을 아까 유닛에서 만든 가상 대상의 위치로 이동합니다.

장점


1. 일괄적으로 가동 가능하고 가동하지 않는 전환
상태에 따라 위치를 동기화하는 부분의 호출을 열거나 닫으면 동기화되지 않거나 동기화되지 않음을 전환할 수 있습니다.
방법을 생각하면'부모가 움직일 때 아이가 움직이지만 아이가 움직일 때 부모가 움직이지 않는다'는 것을 실현할 수 있다.
1. 어떤 대상이use인지 분별할 수 있다
Joint와 마찬가지로 Child에도 VCSitem이 있기 때문에use의 매개 변수로 아이와 부모를 구분할 수 있습니다

결점


1. 코드 작성 필요
방법을 생각하면 이 방법은 많이 할 수 있지만 그에 상응하는 코드를 써야 한다.
특히 확장에 관해서는 약간의 노력이 필요하다.
또 코드의 작법에 따라 무거워질 수도 있다
2. 조금 늦게 이동
다음 이미지를 참조하십시오.JOINT보다 좋아 보여요.

어떻게 하면 좋을까요?


저는 하고 싶은 일의 패턴에 따라 다음과 같은 표를 만들고 싶어요.
ON/OFF 전환 동기화
use로 식별
확대/축소
추천 방법




③ 스크립트
×



③ 스크립트
×



② Joint
×



① 친자관계

어때요?


이번에는 여러 대상을 하나로 묶어 움직이고 싶을 때의 실현 방법을 소개했다.
공연에 관해서는 정확한 정보를 모르기 때문에 상세하게 기재하지 않았다
③의 방법도 그렇게 무겁지 않아요.
Let's enjoy hitokatamari!٩( 'ω' )و

좋은 웹페이지 즐겨찾기