original 게임오브젝트(프리팹)를 복제해서 생성
(복제되는 오브젝트의 모든 컴포넌트 정보가 원본과 완전히 동일)
Instantiate(GameObject original, Vector3 position, Quaternion rotation)
생성된 복제본의 위치를 position으로, 회전을 rotation으로 설정
회전정보를 나타내고 연산하는 방식에는 쿼터니온과 오일러 두가지 방식이 있다
3차원의 3개 각도를 표현하기 위해 사용하는 3x3 크기의 행렬
즉, 360 각도 표현 방식
회전 순서에 따라 겨로가가 달라지기 때문에 회전 순서에 주의해야 함
(유니티에서는 따로 계산할 일이 없기 때문에 걱절할 필요 없다)
장점: 우리가 알고 있는 0~360의 각도를 표현
할 수 있다
단점: 지속적으로 회전을 하는 연산을 할 때 쿼터니온 보다 연산속도가 느리고, 짐벌락 현상이 발생할 수 있다
짐벌락
세 개의 축이 서로 종속적인 관계를 가지고 있기 때문에 발생하는 문제로 회전 연산 도중 축이 하나 사라져 3차원의 오브젝트가 일그러지는 현상
사원수로 3개의 백터 요소와 하나의 스칼라 요소로 구성 (4개의 -1 ~ 1 사이의 값)
장점 : 연산속도가 빠르고, 짐벌락 현상이 발행하지 않는다
단점 : 우리가 알고 있는 0~360의 각도가 아니기 때문에 특정 각도를 표현하기 힘들다
현재 Instantiate의 세번째 매개변수에 사용되는 회전 정보는 쿼터 아이언으로 나타내기 때문에 특정 각도를 입력하는 것이 어렵다
Quaternion.Euler(0, 0, 1)
위와 같은 함수를 사용하여 각도 값을 표현하게되면 쿼너니언 값으로 변형 시켜 준다
Inspector View에 보이는 Transform의 rotation은 개발자의 편의를 위해 오일러로 표현
Quaternion q = Quaternion.Euler(0, 0, 0);
오일러 회전 정보를 입력해서 쿼터니온 회전 값으로 변경
transform.Rotate(new Vector3(1, 0, 0));
x축으로 빙글빙글 돌아라와 같이 지속적인 회전 함수
GameObject clone = Instantiate(GameObject original, Vector3 position, Quaternion rotation);
original 게임오브젝트(프리팹)를 복제해서 생성하고, 생성된 복제 오브젝트의 정보를 clone에 저장 현재 코드에서 clone과 방금 생성된 박스 오브젝트는 동일하다
(clone의 정보가 바뀌면 Hierarchy View에 생성된 오브젝트의 정보가 바뀐다)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSpawner : MonoBehaviour
{
[SerializeField]
private GameObject boxPrefab;
private void Awake()
{
// 회전 값 설정
Quaternion rotation = Quaternion.Euler(0, 0, 45);
// clone 변수에 Instantiate를 생성하여 할당
// 방금 생성된 복제 정보 받아서 설정
GameObject clone = Instantiate(boxPrefab, Vector3.zero, rotation);
// 방금 생성된 게임 오브젝트의 이름 변경
clone.name = "Box001";
// 방금 생성된 게임 오브제트의 생상 변경
clone.GetComponent<SpriteRenderer>().color = Color.black;
// 방금 생성된 게임 오브젝트의 위치 변경
clone.transform.position = new Vector3(2, 1, 0);
// 크기 변경
clone.transform.localScale = new Vector3(3, 2, 1);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSpawner : MonoBehaviour
{
[SerializeField]
private GameObject boxPrefab;
private void Awake()
{
Instantiate(boxPrefab);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSpawner : MonoBehaviour
{
[SerializeField]
private GameObject boxPrefab;
private void Awake()
{
Instantiate(boxPrefab, new Vector3(3, 3, 0), Quaternion.identity);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSpawner : MonoBehaviour
{
[SerializeField]
private GameObject boxPrefab;
private void Awake()
{
Quaternion rotation = Quaternion.Euler(0, 0, 45);
Instantiate(boxPrefab, new Vector3(2, 1, 0), rotation);
}
}