300x250

앞선 글에서 계층화와 투명화/유색화 방법을 알아보았다. 이번 글에서는 계층화된 모델에서 본격적으로 scaling 실습을 진행해보자.

먼저, 계층화, 투명화, 유색화 내용은 다음 글을 참조하자.

https://jjuke-brain.tistory.com/81

 

Unity를 활용한 Parametric Design Program - 계층화 및 주요 부품 scaling (1)

'Unity를 활용한 Parametric Design Program - Scaling 실습'에서 모델 전체 x scale을 키우는 실습을 해봤으니, 이제 주요 부품들을 늘이고 줄여보자. https://jjuke-brain.tistory.com/70?category=923168 Unity..

jjuke-brain.tistory.com

 

기본 scaling 내용은 다음 글에 정리되어 있다.

https://jjuke-brain.tistory.com/70?category=923168 

 

Unity를 활용한 Parametric Design Program - Scaling 실습

'Unity를 활용한 Parametric Design Program - 환경 세팅' 글에 이어서 버튼을 눌렀을 때 prefab을 늘이고, 줄이는 간단한 실습을 진행해보자. 개발 개요, 프로젝트 세팅, 모델에 대한 간단한 내용은 이전 글

jjuke-brain.tistory.com

 

 

 

 

 

 

3. 계층화된 모델의 scaling 실습

 

 

 

 

1) Gameobject 이름으로 찾아 변수에 할당

 

먼저, 작업중인 Scene 내에서 지정한 Gameobject 이름을 찾아 스크립트 내의 변수에 불러와야 한다.

 

예를 들어, 다음과 같은 계층화가 완료된 모델이 있다고 하자.

 

계층화하여 정리한 모델

 

'Hierarchy' 탭을보면, scaling을 적용할 모델인 MCT가 여러 하위 부품으로 나뉘어진 것을 확인할 수 있다.

 

scaling은 MCT 하위의 MainBody, ATC, Table ... 등의 부품에 적용할 것이므로, 각각을 스크립트의 변수에 할당해 주어야 한다.

그 이후, GameObject.Find() 함수로 MCT의 하위 부품에 대한 GameObject를 변수에 할당해줄 수 있다.

위 내용은 계층화, 유색화 과정을 담은 이전 글에 자세히 설명이 되어있으므로 생략한다.

 

이전 글 : https://jjuke-brain.tistory.com/81?category=923168 

 

'useless'를 제외한 모든 하위 부품(11개)의 x축 scale을 2배로 늘리는 코드를 현재 모델에 맞춰 다음과 같이 작성하였다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Scaling : MonoBehaviour
{
    //============================================================
    // scaling parameter
    //============================================================
    static Vector3 vec_MB, vec_ATC, vec_T, vec_A, vec_CP, vec_OT,
                    vec_COL, vec_S, vec_CH, vec_SPR, vec_AB, ovec_MB,
                    ovec_ATC, ovec_T, ovec_A, ovec_CP, ovec_OT, ovec_COL,
                    ovec_S, ovec_CH, ovec_SPR, ovec_AB;
    
    static GameObject MainBody, ATC, Table, Axis, ControlPanel, OilTank,
                        Column, Saddle, Chuck, Spring, AlarmBeam;
    public Vector3[] Vecs = new Vector3[11]{vec_MB, vec_ATC, vec_T, vec_A, vec_CP, vec_OT,
                        vec_COL, vec_S, vec_CH, vec_SPR, vec_AB};
    
    public Vector3[] OriginVecs = new Vector3[11]{ovec_MB, ovec_ATC, ovec_T, ovec_A, ovec_CP, ovec_OT,
                        ovec_COL, ovec_S, ovec_CH, ovec_SPR, ovec_AB};
    
    public GameObject[] Objs = new GameObject[11]{MainBody, ATC, Table, Axis, ControlPanel, OilTank,
                        Column, Saddle, Chuck, Spring, AlarmBeam};

    //============================================================
    // 2 times scaling for x axis function
    //============================================================ 
    public void Scale()
    {
        for (int i = 0; i < Vecs.Length; i++) {
            Vecs[i] = Objs[i].transform.localScale;
        }

        for (int i = 0; i < Vecs.Length; i++) {
            Vecs[i].x = 2.0f; // x축 scale 2배로
            Objs[i].transform.localScale = Vecs[i];
        }
    }

    //============================================================
    // Scaling Canceling function
    //============================================================
    public void Cancel()
    {
        for (int i = 0; i < Vecs.Length; i++) {
            Vecs[i] = OriginVecs[i];
            Objs[i].transform.localScale = Vecs[i];
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        MainBody = GameObject.Find("MainBody");
        ATC = GameObject.Find("ATC");
        Table = GameObject.Find("Table");
        Axis = GameObject.Find("Axis");
        ControlPanel = GameObject.Find("Control");
        OilTank = GameObject.Find("OilTank");
        Column = GameObject.Find("Column");
        Saddle = GameObject.Find("Saddle");
        Chuck = GameObject.Find("Chuck");
        Spring = GameObject.Find("Spring");
        AlarmBeam = GameObject.Find("AlarmBeam");

        // store the origin local scale
        for (int i = 0; i < Vecs.Length; i++) {
            OriginVecs[i] = Objs[i].transform.localScale;
        }
    }

    //============================================================
    // Button Click Triggers
    //============================================================
    
    bool isScalingButtonClicked;
    bool isCancelButtonClicked;

    // Update is called once per frame
    void Update()
    {
        if(isScalingButtonClicked) {
            Scale();
        }
        if(isCancelButtonClicked) {
            Cancel();
        }
    }
}

 

간단한 코드 설명을 해보자면 다음과 같다.

 

  • scaling parameter : scaling을 위한 변수들을 설정하였다. 배열로 11개의 부품들을 간단히 표현 및 사용할 수 있도록 했다.
    • Vecs : scale 변경을 위한 Vector3 클래스의 변수를 담은 배열이다.
    • OriginVecs : scale 변경 이후 처음 상태로 되돌리기 위해 처음 localScale을 담아두기 위한 배열이다.
    • Objs : GameObject 클래스의 변수를 담은 배열이다.
  • Scale() : 간단히 동작을 확인하기 위해, x축 방향으로 2배 스케일링하는 함수이다.
    • 동작 과정은 'https://jjuke-brain.tistory.com/70?category=923168'글을 참조하자.
  • Cancel() : localScale을 초기 상태로 되돌리는 함수이다.
    • 로직은 Scale()과 동일하다.
  • Start() 내에서 GameObject.Find()함수로 각 Objs 변수에 게임 오브젝트를 할당하고, OriginVecs에  처음 localScale을 저장해둔다.
  • Button Click Triggers : 버튼 클릭을 구현하기 위한 트리거 변수이다.
  • Update() 내에서 버튼 클릭에 따른 함수를 실행하여 Scaling, Canceling을 구현한다.

 

이제 버튼을 생성하여 구현하면 다음과 같은 결과를 얻는다. (버튼 생성 및 구현 방법은 역시 'https://jjuke-brain.tistory.com/70?category=923168' 글에 구체적으로 나와있다.)

 

 

 

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기