[Unity 2018 Constraint] 스크립트에서 ConstraintSource를 동적으로 등록/삭제할 때

16820 단어 UnityC#
Unity 2018의 Constraint 시스템 구성 요소
사용법을 알지만 스크립트에서 이 구성 요소를 어떻게 조작합니까? 제가 맞는 부분을 중심으로 설명하고 싶습니다. 그리고 Constraint에 대한 설명은 생략했습니다. 제 설명보다 선조께서 자세히 설명하고 계십니다. 아래를 보십시오.

Unity 객체에 대한 친자 관계


기존의 Unity 부자 관계에서 부자 관계는 일대다
또한 자식 객체도 부모 객체의 Transform에 의해 변경되는 것이 특징입니다.
그러나 UI의 경우 하위 객체가 앞에 나타나는 단점이 반드시 있습니다. 친자 관계가 있으면 레이어링을 할 수 없기 때문입니다. UI의 경우 Layer 설정을 변경해도 적용되지 않습니다. (참고:)
물론 스프릿 렌더의 Sorting Layer에 그림 그리기 순서를 설정하면 이 문제를 해결할 수 있다.

Constraint의 과감한 설명


Constraint 직역은 제한 의미입니다. 이 구성 요소를 사용하면 대상의 동작과 다른 대상의 관계를 제한할 수 있습니다.
상세한 상황은 여기에 쓰여 있다.
http://tsubakit1.hateblo.jp/entry/2018/01/12/233522
※ 주의 ※
편의를 위해 향후 설명의 영향을 받는 대상을'부대상'이라고 부른다.
Constraint는 주관적으로 세 가지 특징을 들 수 있다.
1: 친자 관계는 다대일의 형태를 형성할 수 있다.
2: 친자관계 UI를 만들 필요가 없기 때문에 Hierrarchy의 위치를 바꾸면 그리는 순서를 바꿀 수 있습니다.
(※ 드로잉 순서대로 해결되지 않음)
3: Constraint가 제한된 곳은 Positon,Rotation만 있고 모두 세 가지가 있어 상황에 따라 구분하여 사용할 수 있다.

이번 대본.


최근 GiitHub에는 Unity 편집기가 어떻게 돌아가는지 공개하면서 이를 보면서 코드를 간단히 설명했다.
코드만 알고 싶은 사람은 아래 스크립트를 보십시오.

코드 흐름


1: Constarint 시스템 구성 요소 가져오기
2: ConsutraintSource 구조 작성 및 제한 사항 설정
3: Constraint 2로 만든 ConstraintSource

요점에 부합하다


포인트는 주로 두 가지가 있다.
1: 상위 객체의 요소를 추가하려면 Constarint Source 구조를 만들고 그 위에 객체의 Transform 시스템 정보를 추가해야 합니다.
2:1 추가 외에도 영향도 Weight를 1로 설정해야 한다.
위챗의 영향도는 0~1인 flat값이다. 0으로 설정해도 부모 대상에 대한 제어가 되지 않고 1이면 완전히 지배된다.
완전히 지배되면 부모 대상이 변하지 않으면 (Transform에 변화가 없음) 그 Constarint를 추가한 대상은 변할 수 없습니다.
스크립트를 추가할 때, Weight가 기본적으로 0인 규격처럼, 이것을 무시하는 것이 가장 큰 관건입니다.
ConstraintSource에 관해서는 아래 GiitHub의 Unity 참조서에 적혀 있으며 이를 바탕으로 제작된다.

각본


이번에는 PositionConstraint(위치만)와 ParenntConstraint(친자관계와 유사한 것) 두 가지 모드를 준비했다.
해결 포인트를 생각하면 좀 시끄럽다.
Constraint 구성 요소가 유효하지 않습니다. isActive도 가능합니다.
CSVDataReader.cs

#define POSITION_CONSTRAINT
#undef PARENT_CONSTRAINT

using UnityEngine;
using UnityEngine.Animations; // これがないと Constraintは使えない

public class ConstraintTest : MonoBehaviour {

    private ConstraintSource myConstraintSource;        // ConstarintSource
#if POSITION_CONSTRAINT
    private PositionConstraint myPositionConstraint;    // Position Type
#endif
#if PARENT_CONSTRAINT
    private ParentConstraint myParentConstraint;        // Parent Type
#endif

    [SerializeField]
    private RectTransform SouceRectTransform;// ConstraintSourceの設定にはTransformももちろんOK

    /// <summary>
    /// ConstraintComponentの親オブジェクトを動的に追加する関数
    /// </summary>
    /// <param name="parent">Contraintの親オブジェクト</param>
    private void SetObject2ConstraintSource ( RectTransform parent ) {
        // Constraintの参照元を設定(この処理が一つでも欠けると追尾せず即死するので注意)
        this.myConstraintSource.sourceTransform = parent;
        this.myConstraintSource.weight = 1.0f; // 影響度を完全支配にする(Addの場合は0になるので)
#if POSITION_CONSTRAINT
        this.myPositionConstraint.AddSource(this.myConstraintSource);   // Constraintの参照元を追加
        this.myPositionConstraint.translationOffset = Vector3.zero;     // オフセットを0に
        this.myPositionConstraint.enabled = true;                       // 有効にする(使わないときはfalse)
#endif
#if PARENT_CONSTRAINT
        this.myParentConstraint.AddSource(this.myConstraintSource);     // Constraintの参照元を追加
        this.myParentConstraint.SetTranslationOffset(0, Vector3.zero);  // オフセットを0に
        this.myParentConstraint.enabled = true;                         // 有効にする(使わないときはfalse)
#endif
    }

    /// <summary>
    /// Constraintの設定を解除する
    /// </summary>
    private void DeleteSource ( ) {
#if POSITION_CONSTRAINT
        this.myPositionConstraint.RemoveSource(0);  // Sourceから削除
        this.myPositionConstraint.enabled = false;  // 無効にする 
#endif

#if PARENT_CONSTRAINT
        this.myParentConstraint.RemoveSource(0);  // Sourceから削除
        this.myParentConstraint.enabled = false;  // 無効にする 
#endif
    }

    private void Start ( ) {
#if POSITION_CONSTRAINT
        this.myPositionConstraint = GetComponent<PositionConstraint>( );
#endif
#if PARENT_CONSTRAINT
        this.myParentConstraint = GetComponent<ParentConstraint>();
#endif
    }

    private void Update ( ) {
        // Constarintの有効無効を設定する
        if (Input.GetKeyDown("r")) {
#if POSITION_CONSTRAINT
            if (this.myPositionConstraint.sourceCount > 0) {
                DeleteSource( );
            }
#endif
#if PARENT_CONSTRAINT
            if (this.myParentConstraint.sourceCount > 0) {
                DeleteSource( );
            }
#endif
            else {
                SetObject2ConstraintSource(this.SouceRectTransform);
            }
        }
    }
}

다음은 부모 대상에 부속된 스크립트입니다
Hoge.cs
using UnityEngine;

public class Hoge : MonoBehaviour {

    private bool canMove = false;           // 追尾可能かのフラグ
    private RectTransform myRectTransform;  // オブジェクト自身の位置

    /// <summary>
    /// マウスで移動する処理(UIバージョン)
    /// </summary>
    /// <param name="rTransform">位置</param>
    /// <param name="camera">変換用のカメラ</param>
    private void MoveOnMouse(ref RectTransform rTransform,Camera camera)
    {
        Vector3 mpos = Input.mousePosition;
        mpos.z = 10.0f;
        mpos = camera.ScreenToWorldPoint(mpos);
        rTransform.position = RectTransformUtility.WorldToScreenPoint(camera, mpos);
    }

    // Use this for initialization
    void Start () {
        this.myRectTransform = GetComponent<RectTransform>( );
    }

    // Update is called once per frame
    void Update () {
        // マウスカーソルに追尾するかどうかを切り替える
        if (Input.GetKeyDown("space")) {
            this.canMove = !this.canMove;
        }
        // 追尾可能ならマウスに追従させる
        if (this.canMove) {
            MoveOnMouse(ref this.myRectTransform, Camera.main);
        }
    }
}

동작 테스트


그럼, 실제로 작동해보세요. 이번에는 UI의 Image를 사용하겠습니다.
Scene에서 "Parent", "Child"라는 이름을 가진 두 개의 Image를 구성합니다.
다음에 다음과 같이 설정하십시오.
여기에 차일드를 설정할 때 두 가지 주의점이 있다.
1: Constraint 시스템 구성 요소에서 IsActive를 검사합니다(기본적으로 포함되지 않음).
2:ConstraintTest 스크립트의 SourceRectTransform 연결 Parent (상위 객체를 등록할 수 없음)
  
마지막으로 그림 그리는 순서를 고려해서 위에서 차일드, Parent로 배치해 주세요.
완성됐습니다.
우리 서둘러 미리보기에서 움직여보자.
Space 키를 누르면 Parent가 마우스 커서의 위치를 따라갑니다. 여기서 R 키를 누르면 Child 대상도 Parent를 따라갑니다. 마우스 커서를 따라가는 동작을 표시합니다.
그럼 스페이스 키로 마우스 커서의 추종을 멈추고 차일드 대상의 인스펙터를 보세요.

네, Parent가 Sources에 추가되었네요. 옆에 있는 수치는 앞서 말한 영향도입니다. 여기서 이것을 0으로 설정하고 스페이스 키를 다시 눌러주세요. Parent만 따라갈 수 있어요.
따라서 스크립트에서 Constraint 시스템 구성 요소를 동적으로 처리하기 위한 메모입니다.
오류가 있으면 지적해 주십시오.

좋은 웹페이지 즐겨찾기