Vector3.Angle을 사용, 하지만 각도가 90도 이내로만 나온다.(0~360도 사이의 값으로 각도를 구하고 싶다면 문제가 됨) 이에 대한 해결책은 아래와 같다
public float ContAngle(Vector3 fwd, Vector3 targetDir)
{
    float angle = Vector3.Angle(fwd, targetDir);

    if (AngleDir(fwd, targetDir, Vector3.up) == -1)
    {
        angle = 360.0f - angle;
        if( angle > 359.9999f )
            angle -= 360.0f;
        return angle;
    }
    else
        return angle;
}

public int AngleDir( Vector3 fwd, Vector3 targetDir, Vector3 up)
{
    Vector3 perp = Vector3.Cross(fwd, targetDir);
    float dir = Vector3.Dot(perp, up);

    if (dir > 0.0)
        return 1;
    else if (dir < 0.0)
        return -1;
    else
        return 0;
}
참고 사이트: http://blog.naver.com/sdragoon/150108963945
http://forum.unity3d.com/threads/31420-Left-Right-test-function
http://answers.unity3d.com/questions/18105/how-to-calculate-the-angle-between-two-vectors
Container<int> c;
라는 컨테이너가 있을때

1963이라는 값을 가진것을 모두 지우고 싶다면

연속 메모리 컨테이너(vector, deque, string)의 경우에 가장 좋은 방법은 erase-remove 합성문이다.
 
erase( remove(c.begin(), c.end(), 1963), c.end()); 
// 컨테이너가 vector, string 혹은 deque일 때 특정한 값을 가진 요소를 없애는
// 가장 좋은 방법은 erase-remove 합성문을 사용하는 것이다.

이 방법은 양방향 반복자를 지원하는 list에도 통하지만, list의 경우엔 멤버함수인 remove가 더 효율적이다.
 
c.remove(1963);
// 컨테이너가 list일 때에는 remove 멤버함수가 특정한 값을 가진 요소를 모두 없애는 데에 더 좋다.

c가 표준 연관 컨테이너일 때에는(set, multiset, map, multimap) remove라는 이름을 가진 어떤것도 소용이 없다.

멤버함수로는 remove가 없을뿐더러 remove를 사용하면 컨테이너에 값을 덮어써서 컨테이너가 변형된다.

연관컨테이너에서 특정한 값을 가진 요소를 지울땐 erase를 사용한다.

c.erase(1963);
// 컨테이너가 표준 연관 컨테이너일 때에는 erase 멤버 함수가 특정한 값을 가진 요소를
// 모두 없애는 데에 가장 좋다.

이렇게 하면 삭제도 제대로되고 효율적이다.

여기서 특정한 값을 가진 요소를 모두 없애지 않고다음의 술어구문이 true를 반환하는 요소를 모두 없앤다고 할때
 
bool badValue(int x);  // x가 "나쁘다"면 true를 반환합니다.

c.erase( remove_if(c.begin(), c.end(), badValue), c.end());
// 컨테이너가 vector, string, deque일 때 badValue가
// true를 반환하는 요소를 모두 없애는 가장 좋은 방법입니다.

c.remove_if(badValue);
// 컨테이너가 list일 때 badValue가 true를 반환하는 요소를
// 모두 없애는 가장 좋은 방법입니다.

표준 연관 컨테이너의 경우(set, map 등)
이렇게 쉽게 문제가 해결되지는 않는다.
따라서 처음부터 끝까지 도는 루프를 넣어서 요소를 직접 검사해서 지워야 한다.
이 작업은 소스코드도 간단하다.

Container c;
...
for(Container::iterator i = c.begin(); i != c.end(); /* 비어있음 */)
// for 루프의3번째 부분이 비어있고 아래쪽에서 증가된다.
{
    if(badValue(*i)) // i가 가리키는 값이 "나쁜값"이면
        c.erase( i++ ); // 후위증가에 의해 i를 증가시킨다.
    else
        ++i;
}

만약 vector, string, deque로 루프를 도는 중간에 erase를 해야 하는 상황이 생긴다면 이렇게 바꾸면 된다.

for(Container::iterator i = c.begin(); i!= c.end(); /* 비어있음 */)
{
    ...
    ...
    ...

    if(badValue(*i)
    {
        i = c.erase(i); // erase의 반환값을 i에 저장해서 반복자의 유효성을 유지시킨다.
    }
    else
    {
        ++i;
    }
}

이 글은 이펙티브 STL 책을 참고하여 작성하였으며, 만약 저작권적으로 문제가 된다면 댓글등으로 삭제요청하시면 삭제조치 하도록 하겠습니다.

http://sdmeter.tistory.com  <= 여기 블로그는 따로 있습니다.