[수학] 회전, 이동 관련 코드


  • 한 축으로 타겟(targetAngle) 지점까지 회전
object.transform.eulerAngles = new Vector3(0, 0, Mathf.LerpAngle
    (object.transform.eulerAngles.z, targetAngle, Time.deltaTime* fSpeed));

  • 타겟을 방향으로 이동
public Transform m_kTargetTrans;
private Transform m_kCachedTrans;
private const float m_fMoveSpeed = 1.0f;

void Start()
{
    m_kCachedTrans = gameObject.GetComponent<Transform>();
}

private void UpdatePosition()
{
    Vector3 kDir = m_kTargetTrans.position - m_kCachedTrans.position;
    kDir.Normalize();  // 정규화 하면 정속 주행 안하면 감속 주행(값으 크기 차로 인해)                       
    kDir *= m_fMoveSpeed * Time.deltaTime;
    m_kCachedTrans.position -= kDir;   
}

  • 진행 방향으로 회전 2D
private void FixedUpdate()                                      
{
    Vector2 kTargetVel = GetComponent<Rigidbody2D>().velocity;   // 속도(방향과 속력) 
    Vector2 kDir = kTargetVel.normalized;                        // 정규화(방향만 축출)
    fDegree = Mathf.Atan(kDir.y / kDir.x) * Mathf.Rad2Deg; // Atan을 구한 뒤 Degree로 변환
    transform.rotation = Quaternion.Euler(0, 0, fDegree);       // 회전 적용
}

  • 두 물체 사이 거리 구하기(백터의 뺄샘)
public Transfrom kPlayerTrans;   
public Transfrom kEnemyTrans;
const float fCloseDistance = 3.0f;

private void LastUpdate()     
{
    // 백터의 뺄셈으로 구하기(정확한 거리를 알아내야 할 때)
    float fDistance = Vector3.Distance(kPlayerTrans.position, kEnemyTrans.position);
    // 백터의 크기를 구한 뒤 뺄셈으로 구하기(속도 느림)     
    float fDistance =  (kPlayerTrans.position - kEnemyTrans.position).magnitude;
    // 백터의 제곱근의 크기끼리의 뺄샘으로 구하기(두 백터간 일정 간격의 크기가 필요할 때)     
    float fDistanceSqr = (kPlayerTrans.position - kEnemyTrans.position).sqrMagnitude;

    // ex 근접 거리도 제곱근으로 배교 한다.
    if(fDistance < (fCloseDistance * fCloseDistance) )
       Debug.Log ("공격");
    else 
       Debug.Log ("이동");
}

댓글

이 블로그의 인기 게시물

[유니티] 오류 사례 "Moving file failed", "Temp"

[유니티 사례] 비주얼 스튜디오(Visual Studio) 실행 오류

[유니티] 구글 지도 출력 샘플