- 수정됨
유니티 트랜스폼 제약조건 조정 문제
- 수정됨
안녕하세요. 각 캐릭터마다 어깨 너비를 기준으로 몸의 근육과 몸집을 구분하고자 사진과 같이 구현하였습니다.
TC_LeftShoulder, TC_RightShoulder는 각각 해당 Skeleton의 TransformConstraint 입니다.
Show_OffsetX_L, Show_OffsetX_R은 데이터를 직접 확인하고자 만든 float 필드입니다.
캐릭터 하나만 두고 하면 잘 되는데 여러명을 배치하게 되면 이상하게 적용됩니다.
캐릭터 별로 Offset 값을 확인했을 때, 인스턴스마다 고유의 값을 가지는 것을 확인했습니다.
Offset 값에 따라서 스킨 변경은 제대로 작동 됩니다.
캐릭터 형태가 자신의 Offset 값에 반응하지 않고 다른 캐릭터의 Offset 값에 반응하는 경우가 나타납니다. (첨부한 사진이 그 예시입니다. 첫번째 캐릭터는 형태가 자신의 Offset에 반응하지 않고 두번째 캐릭터의 Offset에 반응합니다.)
게임의 핵심이어서 해결하고 싶습니다. 답변 부탁드립니다!
여기서bone.Data.OffsetX
를 수정하고 있습니다. 이름에 'data'가있는 모든 것은 단일 인스턴스의 매개 변수가 아닌 공유 스켈레톤 데이터에 액세스합니다. 따라서 귀하의 경우에는bone.Data.OffsetX
를 설정하지 말고 대신bone.X
를 설정하여 로컬 뼈 X 오프셋을 조정하십시오.
기본 디자인과 API 사용 방법을 이해하려면 여기에서 '데이터 개체'및 '인스턴스 개체'에 대한 문서를 참조하세요.
Runtime Architecture - Spine Runtimes Guide: Data objects
Update ()
에서 본 위치 수정에 관하여 :
애니메이션 중 하나라도bone.X
오프셋을 수정하는 경우 여기에 설명 된대로SkeletonAnimation.UpdateLocal
콜백 델리게이트를 사용해야합니다.
spine-unity Runtime Documentation: Life cycle
// 업데이트 본 위치 델리게이트 메서드
void AdjustLocalBoneLocations (ISkeletonAnimation anim) {
// 로컬 애니메이션 업데이트가 완료된 후에 호출됩니다.
bone.X = ..;
}
// 델리게이트 메소드 등록
void Start () {
skeletonAnimation.UpdateLocal-= AdjustLocalBoneLocations;
skeletonAnimation.UpdateLocal + = AdjustLocalBoneLocations;
}
You are modifying bone.Data.OffsetX
here. Anything with data
in its name is accessing shared skeleton data, not a single instance's parameters. So for your case, don't set bone.Data.OffsetX
but instead set bone.X
to adjust local bone X offset.
Please see the documentation about Data objects
and Instance objects
here to understand the basic design and how the API shall be used:
Runtime Architecture - Spine Runtimes Guide: Data objects
Regarding modifying bone location in Update()
:
If any of your animations are also modifying the bone.X
offset, you need to use the SkeletonAnimation.UpdateLocal
callback delegate as described here:
spine-unity Runtime Documentation: Life cycle
// your update bone location delegate method
void AdjustLocalBoneLocations (ISkeletonAnimation anim) {
// this is called after local animation updates have been completed.
bone.X = ..;
}
// register your delegate method
void Start() {
skeletonAnimation.UpdateLocal -= AdjustLocalBoneLocations;
skeletonAnimation.UpdateLocal += AdjustLocalBoneLocations;
}
감사합니다! 덕분에 해결했습니다.
천만에요.
You're welcome.