본문 바로가기

STUDY/Unity

[유니티 기초] 캐릭터의 이동(1)

728x90


* 물체를 이동시키거나 회전시키는 방법

> 첫번째. Transform 컴포넌트의 position, rotation 속성을 지속해서 변경하는 방법

> 두번째. 물리엔진(PhysX, Box2D)을 이용해 물리적인 힘 또는 회전력을 가해 변경하는 방법

 

1. Transform 컴포넌트의 position, rotation 속성을 지속해서 변경하는 방법

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

public class PlayerCtrl : MonoBehaviour
{
	void Start()
    {
    }
    
    void Update()
    {
    	float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        
        Debug.Log("h=" + h);
        Debug.Log("v=" + v);
        
        // Transform 컴포넌트의 position 속성값을 변경
        // Transform 컴포넌트의 position 속성의 z축 값을 프레임마다 1씩 증가시켜 전진.
        transform.position += new Vector3(0, 0, 1);
    }
}

  - Transform 컴포넌트의 position 속성의 Vector3(x, y, z)타입으로 생성.

  - 전진 : 유니티는 왼손 좌표계임으로 +Z 축 방향

  - 후진 : -Z 축 방향

  - Update 함수에 코드를 작성했기에 프레임마다 실행.

  - 예시 : 30fps? 1초에 30번 호출.

 

2. Vector3 구조체 

public struct Vector3 : IEquatable<Vector3>, IFormattable
{
	public const float kEpsilon = 1E-o5F;
    public const float kEpsilonNormalSqrt = 1E-15F;
    
    public float x;
    
    public float y;
    
    public float z;
    
    public static Vector3 right { get; }
    
    public static Vector3 left { get; }
    
    public static Vector3 up { get; }
    
    public static Vector3 back { get; }
    
    public static Vector3 forward { get; }
    
}

   - Vector3 구조체의 일부분 코드임.

 

3. 정규화 벡터

  - 벡터 vector : 크기, 방향을 나타냄.

  - 정규화 벡터 Nomalized Vector / 단위 벡터 Unit Vector :  각 축의 크기가 1인 벡터. 방향만 표시.

  - 표1 : 방향을 가리키는 정규화 벡터

  - x, y, z 축 : 이는 R, G, B 색상에 대응된다.

Vector3.forward Vector3(0, 0, 1)
Vector3.back Vector3(0, 0, -1)
Vector3.left Vector3(-1, 0, 0)
Vector3.right Vector3(1, 0, 0)
Vector3.up Vector3(0, 1, 0)
Vector3.down Vector3(0, -1, 0)
Vector3.one Vector3(1, 1, 1)
Vector3.zero Vector3(0, 0, 0)

  - Vector3.forward * 1 : "전진 방향 * 속력" 이다.

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

public class PlayerCtrl : MonoBehaviour
{
	void Start()
    {
    }
    
    void Update()
    {
    	float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        
        Debug.Log("h=" + h);
        Debug.Log("v=" + v);
        
        //정규화 벡터를 사용한 코드
        transform.position +=Vector3.forward * 1;
    }
}

 

4. 컴포넌트 캐시 처리

  - Update 함수는 프레임마다 한 번씩 호출되므로 최적화에 주의해야함.

  - 따라서, Transform 컴포넌트의 변수 transform 사용보다 미리 변수에 담아 이에 접근하는 것이 빠름.

  - 컴포넌트 캐시 처리 :  스크립트에서 접근할 컴포넌트를 Start와 같은 함수에 미리 변수 할당한 후, 변수를 통해 접근.

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

public class PlayerCtrl : MonoBehaviour
{
	// 컴포넌트 캐시 처리 변수
    private Transform tr;
    
    void Start()
    {
    	//Transform 컴포넌트를 추출해 변수에 대입
    	tr = GetComponent<Transform>();
    }
    
    void Update()
    {
    	float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        
        Debug.Log("h=" + h);
        Debug.Log("v=" + v);
        
        tr.position += Vector3.forward * 1;
    }
}

- GetComponent 함수는 아래와 같이 다양하게 쓸 수 있음.

tr = GetComponent<Transform>();
tr = GetComponent("Transform") as Transform;
tr = (Transform)GetComponent(typeof(Transform));
tr = this.gameObject.GetComponent<Transform>();

 

5. Translate 함수

  - 게임오브젝트의 이동 처리를 편하게 할 수 있는 함수

  - Translate 함수의 두 번째 인자 : 게임오브젝트 이동의 월드 좌표(Space.World)기준할지, 로컬 좌표( 기준할지 결정. 

void Translate(Vector3 direction, [Space relativeTo])

void Update()
{
	tr.Translate(Vector3.forward * 1.0f);
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
	private Transform tr;
    
    void Start()
    {
    	tr = GetComponent<Transform>();
    }
    
    void Update()
    {
    	float h =Input.GetAxis("Horizontal");
        float v =Input.GetAxis("Vertical");
        
        Debug.Log("h=" + h);
        Debug.Log("v=" + v);
        
        //Translate 함수를 사용한 이동 로직
        tr.Translate(Vector3.forward * 1);
    }
}
728x90