Beispiel #1
0
 // Use this for initialization
 void Start()
 {
     tr    = GetComponent <Transform>();
     Arrow = GameObject.FindGameObjectWithTag("Arrow");
     Arrow.SetActive(false);
     ArrowTr = Arrow.GetComponent <Transform>();
     BallE   = GetComponent <BallEnergy>();
     //ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 }
Beispiel #2
0
 private void Start()
 {
     if (null == colletor)
     {
         colletor = GameObject.Find("BlowingPoint").GetComponent <Transform>();
     }
     if (null == m_Multiplier)
     {
         m_Multiplier = GameObject.Find("Multiplier").GetComponent <Multiplier>();
     }
     if (null == m_Score)
     {
         m_Score = GameObject.Find("Score").GetComponent <Score>();
     }
     if (null == m_BallEnergy)
     {
         m_BallEnergy = GameObject.Find("Ball").GetComponent <BallEnergy>();
     }
     scoreText.SetActive(false);
 }
    void OnTriggerEnter(Collider coll)
    {
        if (coll.gameObject.tag == "Right")
        {
            // Debug.Log("right");
            //Debug.Log(rig.velocity);
            rig.velocity = new Vector3(-rig.velocity.x, 0.0f, rig.velocity.z);
        }
        else if (coll.gameObject.tag == "Left")
        {
            //  Debug.Log("Left");
            //Debug.Log("전 = " + rig.velocity);
            // rig.velocity = Vector3.zero;
            rig.velocity = new Vector3(-rig.velocity.x, 0.0f, rig.velocity.z);
            // Debug.Log("후 = " + rig.velocity);
        }
        else if (coll.gameObject.tag == "Up")
        {
            rig.velocity = new Vector3(rig.velocity.x, 0.0f, -rig.velocity.z);
            // Debug.Log("Up");
        }
        else if (coll.gameObject.tag == "Bottom")
        {
            rig.velocity = new Vector3(rig.velocity.x, 0.0f, -rig.velocity.z);
            // Debug.Log("Bottom");
        }
        else if (coll.gameObject.tag == "Ball")
        {
            //  Debug.Log("공과 충돌함");

            /*
             * modulus of elasticity <= 탄성계수
             * m1, m2 는 각각 공의 질량
             * v1_i, v2_i 는 각각 공의 충돌전 속도
             * v1_f, v2_f 는 각각 공의 충돌후 속도
             * =================================================================================
             *
             * 운동량 보존의 법칙에 따라 m1v1_i +m2v2_i = m1v1_f + m2v2_f 가 성립 함-- 1번 식
             * (v1_f - v2_f) = -탄성계수(v1_i - v2_i)------------------------------ - 2번 식
             *
             * 위 공식을 이용하여 충돌후 v1_f 와 v2_f를 구함
             *
             * 우선 m1v1_i + m2v2_i = m1v1_f + m2v2_f 을 이용해 본다.
             * (전제1) 당구공의 질량은 똑같다 즉, m1 == m2 가 성립함
             * 따라서 v1_i + v2_i = v1_f + v2_f 이다. ---------------------------------- 1번 식
             *
             * 1번식과 2번식을 더하면 v1_f와 v2_f를 구할 수 있다.
             * v1_f + v2_f = v1_i + v2_i  ------------------------------------------- 1번 식
             +)(v1_f - v2_f) = -탄성계수(v1_i - v2_i)-------------------------------- 2번 식
             * ----------------------------------------
             * 2v1_f = (v1_i + v2_i) - 탄성계수(v1_i - v2_i)
             * v1_f = ((v1_i + v2_i) - 탄성계수(v1_i - v2_i)) / 2 -------------------- v1_f값
             *
             * v2_f = v1_i + v2_i - v1_f
             * v2_f = v1_i + v2_i - ((v1_i + v2_i) - 탄성계수(v1_i - v2_i)) / 2 ------ v2_f값
             *
             *     */
            // 충돌하는 물체 처음속도 v1_i // 나중속도 v1_f  각각 x,z 성분 따로 구함.
            // 충돌당할 물체 처음속도 v2_i // 나중속도 v2_f
            //Debug.Log("나의 이름은 : " + this.name);
            //if (coll.gameObject.name == "Ball (3)")
            //{
            //    Debug.Log("나는 꺼져..");
            //    return;
            //}
            BallEnergy OtherBall = coll.gameObject.GetComponent <BallEnergy>();

            float v1_i_x = this.rig.velocity.x;

            float v1_i_z = this.rig.velocity.z;
            //Debug.Log("name = " + coll.gameObject.name);
            //Debug.Log("v1_i_x = " + v1_i_x);
            //Debug.Log("v1_i_z = " + v1_i_z);
            //Debug.Log("OtherBall = " + OtherBall);
            //Debug.Log("OtherBall.rig.velocity.x = " + OtherBall.rig.velocity.x);

            Vector3 OtherBallVelocity = OtherBall.getVelocity();
            //Debug.Log(this.name + "의 OtherBallVelocity : " + OtherBallVelocity);
            //Debug.Log(this.name + "의 coll = " + coll.name);

            // 충돌전 충돌당할 물체의 속도를 가져옴
            float v2_i_x = OtherBallVelocity.x;
            float v2_i_z = OtherBallVelocity.z;
            //Debug.Log("v2_i_x = " + v2_i_x);
            //Debug.Log("v2_i_z = " + v2_i_z);

            // v1_f = ((v1_i + v2_i) - 탄성계수(v1_i - v2_i)) / 2 -------------------- v1_f값
            float v1_f_x = get_V1_F(v1_i_x, v2_i_x);
            float v1_f_z = get_V1_F(v1_i_z, v2_i_z);

            //Debug.Log("v1_f_x = " + v1_f_x);
            //Debug.Log("v1_f_z = " + v1_f_z);

            // 충돌할때 Ball 끼리 충돌하므로 서로 자신의 OnTriggerEnter를 호출 한다.
            // 따라서 이곳에서 충돌하는 모든 Ball의 나중속도를 구해 버리면
            // 각각 Ball이 한번씩 모두 2번 나중속도를 구하는 꼴이 되버린다.
            // 이렇게 되면 충돌 당하는 Ball이 순간적으로 다시 충돌 하는 Ball에게 속도를 줘버려서
            // 마치 아무일도 없는냥 충돌 하는 Ball이 그냥 통과하는 것 처럼 보인다.

            // 따라서 나 외에 다른 Ball은 신경 쓰지 말고 각자 자신의 Ball의 속도를 구하기로 했다.
            // 그래서 v2_f를 구하는 곳은 모두 주석 처리 했다.

            // 하지만 각각 공의 속도를 구하려고 하니.. 문제가 있었다.
            // 충돌 하는 쪽과 충돌 당하는 쪽, 둘 중에 먼저 호출 된 OnTriggerEnter함수가 자신의
            // 속도를 바꾸어 버리는 바람에 나중에 호출 된 Ball의 OnTriggerEnter함수는
            // 먼저 호출되어 이미 속도가 바뀌어 버린 v2_i를 가져와 버린다...
            // 이 문제를 해결하기 위해 준비가 되었냐는 bool isOK변수를 만들었다.
            // 충돌하는 두 공이 모두 자신의 나중 속도를 구한 후에 isOK = true로 변경해주었다.
            // 그리고 Update함수에서 isOK가 true일때 자신의 나중 속도를 적용해 주었다.

            // v2_f = v1_i + v2_i - v1_f -------------------------------- v2_f값
            //float v2_f_x = v1_i_x + v2_i_x - v1_f_x;
            //float v2_f_z = v1_i_z + v2_i_z - v1_f_z;

            // 속도 벡터 만듬
            v1_f = new Vector3(v1_f_x, 0.0f, v1_f_z);
            //Vector3 v2_f = new Vector3(v2_f_x, 0.0f, v2_f_z);

            // 출발!
            //Debug.Log("v2_f = " + v2_f);
            //Debug.Log("v1_i_x = " + v1_i_x);
            //Debug.Log("v1_f_x = " + v1_f_x);
            //OtherBall.BallStart(v2_f);
            //Debug.Log(this.name + " v1_f : " + v1_f);
            //Debug.Log(this.name + " v2_f : " + v2_f);

            isOK = true;
            //Debug.Log(this.name + " isOK = " + isOK);
            return;
        }
    }
Beispiel #4
0
    void OnTriggerEnter(Collider coll)
    {
        // 축 비정렬 벡터 반사
        // 벽과 충돌하면
        if (coll.tag == "Wall")
        {
            // 벽의 정보를 담을 구조체
            RaycastHit hit;
            // 레이가 벽과 충돌하면
            if (Physics.Raycast(transform.position, rig.velocity.normalized,
                                out hit, Mathf.Infinity, LayerMask.GetMask("Wall")))
            {
                // 벽의 노말정보를 가져옴 (내적에 이용)
                Vector3 n = hit.normal;
                // 공의 충돌전 속도 (내적에 이용)
                Vector3 vi = rig.velocity;
                //  충돌방향의 반대 방향과 벽의 노말정보와 내적하여 벡터의 길이를 구하고
                float pLength = Vector3.Dot(-vi, n);
                // 벡터의 길이와 노말정보를 곱하여 벡터를 구합니다.
                Vector3 p = pLength * n;
                // 평행사변형이므로 2배를 해주고 vi값을 더해주면 반사벡터가 나온다.
                Vector3 vf = 2 * p + vi;
                // 적용
                rig.velocity = vf;
            }
        }

        /* 당구대가 회전하면 쓸모가 없다... 축정렬
         * if (coll.gameObject.tag == "Right")
         * {
         *  // Debug.Log("right");
         *  //Debug.Log(rig.velocity);
         *  rig.velocity = new Vector3(-rig.velocity.x, 0.0f, rig.velocity.z);
         * }
         * else if (coll.gameObject.tag == "Left")
         * {
         * //  Debug.Log("Left");
         *  //Debug.Log("전 = " + rig.velocity);
         *  // rig.velocity = Vector3.zero;
         *  rig.velocity = new Vector3(-rig.velocity.x, 0.0f, rig.velocity.z);
         *  // Debug.Log("후 = " + rig.velocity);
         * }
         * else if (coll.gameObject.tag == "Up")
         * {
         *  rig.velocity = new Vector3(rig.velocity.x, 0.0f, -rig.velocity.z);
         * // Debug.Log("Up");
         * }
         * else if (coll.gameObject.tag == "Bottom")
         * {
         *  rig.velocity = new Vector3(rig.velocity.x, 0.0f, -rig.velocity.z);
         * // Debug.Log("Bottom");
         * }
         */
        else if (coll.gameObject.tag == "Ball")
        {
            isCrash = true;
            //  Debug.Log("공과 충돌함");

            /*
             * modulus of elasticity <= 탄성계수
             * m1, m2 는 각각 공의 질량
             * v1_i, v2_i 는 각각 공의 충돌전 속도
             * v1_f, v2_f 는 각각 공의 충돌후 속도
             * =================================================================================
             *
             * 운동량 보존의 법칙에 따라 m1v1_i +m2v2_i = m1v1_f + m2v2_f 가 성립 함-- 1번 식
             * (v1_f - v2_f) = -탄성계수(v1_i - v2_i)------------------------------ - 2번 식
             *
             * 위 공식을 이용하여 충돌후 v1_f 와 v2_f를 구함
             *
             * 우선 m1v1_i + m2v2_i = m1v1_f + m2v2_f 을 이용해 본다.
             * (전제1) 당구공의 질량은 똑같다 즉, m1 == m2 가 성립함
             * 따라서 v1_i + v2_i = v1_f + v2_f 이다. ---------------------------------- 1번 식
             *
             * 1번식과 2번식을 더하면 v1_f와 v2_f를 구할 수 있다.
             * v1_f + v2_f = v1_i + v2_i  ------------------------------------------- 1번 식
             +)(v1_f - v2_f) = -탄성계수(v1_i - v2_i)-------------------------------- 2번 식
             * ----------------------------------------
             * 2v1_f = (v1_i + v2_i) - 탄성계수(v1_i - v2_i)
             * v1_f = ((v1_i + v2_i) - 탄성계수(v1_i - v2_i)) / 2 -------------------- v1_f값
             *
             * v2_f = v1_i + v2_i - v1_f
             * v2_f = v1_i + v2_i - ((v1_i + v2_i) - 탄성계수(v1_i - v2_i)) / 2 ------ v2_f값
             *
             *     */
            // 충돌하는 물체 처음속도 v1_i // 나중속도 v1_f  각각 x,z 성분 따로 구함.
            // 충돌당할 물체 처음속도 v2_i // 나중속도 v2_f
            //Debug.Log("나의 이름은 : " + this.name);
            //if (coll.gameObject.name == "Ball (3)")
            //{
            //    Debug.Log("");
            //    return;
            //}
            // 충돌당할 공의 속도를 가져오기 위해 스크립트를 가져옴.
            BallEnergy OtherBall         = coll.gameObject.GetComponent <BallEnergy>();
            Vector3    OtherBallVelocity = OtherBall.getVelocity();
            // 충돌전 충돌당할 물체의 속도를 가져옴
            float v2_i_x = OtherBallVelocity.x;
            float v2_i_z = OtherBallVelocity.z;

            // 나의 속도
            float v1_i_x = this.rig.velocity.x;
            float v1_i_z = this.rig.velocity.z;

            // v1_f = ((v1_i + v2_i) - 탄성계수(v1_i - v2_i)) / 2 -------------------- v1_f값
            // 충돌체의 질량이 같을 때
            //float v1_f_x = get_V1_F(v1_i_x, v2_i_x);
            //float v1_f_z = get_V1_F(v1_i_z, v2_i_z);

            // 충돌체의 질량이 서로 다를 때
            float v1_f_x = get_V1_F(v1_i_x, rig.mass, v2_i_x, OtherBall.rig.mass);
            float v1_f_z = get_V1_F(v1_i_z, rig.mass, v2_i_z, OtherBall.rig.mass);

            // 충돌할때 Ball 끼리 충돌하므로 서로 자신의 OnTriggerEnter를 호출 한다.
            // 따라서 이곳에서 충돌하는 모든 Ball의 나중속도를 구해 버리면
            // 각각 Ball이 한번씩 모두 2번 나중속도를 구하는 꼴이 되버린다.
            // 이렇게 되면 충돌 당하는 Ball이 순간적으로 다시 충돌 하는 Ball에게 속도를 줘버려서
            // 마치 아무일도 없는냥 충돌 하는 Ball이 그냥 통과하는 것 처럼 보인다.

            // 따라서 나 외에 다른 Ball은 신경 쓰지 말고 각자 자신의 Ball의 속도를 구하기로 했다.
            // 그래서 v2_f를 구하는 곳은 모두 주석 처리 했다.

            // 하지만 각각 공의 속도를 구하려고 하니.. 문제가 있었다.
            // 충돌 하는 쪽과 충돌 당하는 쪽, 둘 중에 먼저 호출 된 OnTriggerEnter함수가 자신의
            // 속도를 바꾸어 버리는 바람에 나중에 호출 된 Ball의 OnTriggerEnter함수는
            // 먼저 호출되어 이미 속도가 바뀌어 버린 v2_i를 가져와 버린다...
            // 이 문제를 해결하기 위해 준비가 되었냐는 bool isOK변수를 만들었다.
            // 충돌하는 두 공이 모두 자신의 나중 속도를 구한 후에 isOK = true로 변경해주었다.
            // 그리고 Update함수에서 isOK가 true일때 자신의 나중 속도를 적용해 주었다.

            // 따라서 굳이 구할 필요가 없는 v2_f값 주석 처리(다른 공의 충돌 후 속도)
            // v2_f = v1_i + v2_i - v1_f -------------------------------- v2_f값
            //float v2_f_x = v1_i_x + v2_i_x - v1_f_x;
            //float v2_f_z = v1_i_z + v2_i_z - v1_f_z;

            // 속도 벡터 만듬
            v1_f = new Vector3(v1_f_x, 0.0f, v1_f_z);
            angleAcceleration   = GetAngleacceleration(coll);
            rotationVisualSpeed = CarRotationVisulalSpeed / angleAcceleration;
            // 출발!
            isOK = true;
            return;
        }
    }