Ejemplo n.º 1
0
    void Update()
    {
        // 何も掴んでいない場合
        if (!IsGrabbing)
        {
            // 掴み操作が有効だったオブジェクトを取得
            List <GrabbableObject> grabbingObjList = new List <GrabbableObject>();
            foreach (var grabObj in grabObjList)
            {
                if (grabObj.CheckGrabInput(Controller))
                {
                    grabbingObjList.Add(grabObj);
                }
            }
            // 掴み操作が有効なオブジェクトが存在すれば
            if (grabbingObjList.Count > 0)
            {
                // 最も位置の近いオブジェクトを掴む対象として取得
                GrabbableObject grabTargetObj = null;
                float           nearDis       = float.MaxValue;
                foreach (var grabbingObj in grabbingObjList)
                {
                    if (!grabbingObj)
                    {
                        continue;
                    }
                    float dis = Vector3.Distance(transform.position, grabbingObj.transform.position);
                    if (nearDis > dis)
                    {
                        nearDis       = dis;
                        grabTargetObj = grabbingObj;
                    }
                }

                // 掴むオブジェクトの掴めるコライダーを取得
                List <GrabbableCollider> grabbingColList = new List <GrabbableCollider>();
                foreach (var grabCol in grabColList)
                {
                    if (grabCol.Obj == grabTargetObj)
                    {
                        grabbingColList.Add(grabCol);
                    }
                }

                // 最も向きの近いTransformに付いているコライダーを掴むコライダーとして取得
                GrabbableCollider grabTargetCol = null;
                float             nearAngle     = float.MaxValue;
                foreach (var grabbingCol in grabbingColList)
                {
                    if (!grabbingCol)
                    {
                        continue;
                    }
                    float angle = Vector3.Dot(transform.forward, grabbingCol.transform.forward);
                    if (nearAngle > angle)
                    {
                        nearAngle     = angle;
                        grabTargetCol = grabbingCol;
                    }
                }

                // 掴む
                GrabObject(grabTargetCol);
            }
        }
        // 既に何か掴んでいる場合
        else
        {
            // 離し操作が有効であれば
            if (GrabObj.CheckReleaseInput(Controller))
            {
                // 離す
                ReleaseObject();
            }
        }
    }