Esempio n. 1
0
 // 忽略 武器和 人物部分的碰撞
 private void IgnoreHWCollision(Collider weaponCollider, bool ignore)
 {
     Physics.IgnoreCollision(am.targetTest.GetComponent <Collider>(), weaponCollider, ignore);
     Physics.IgnoreCollision(humanoidParts.GetBodyPart(HumanBodyBones.RightHand).colliders[0], weaponCollider, ignore);
     Physics.IgnoreCollision(humanoidParts.GetBodyPart(HumanBodyBones.RightLowerArm).colliders[0], weaponCollider, ignore);
 }
Esempio n. 2
0
            protected override void OnFetch()
            {
                if (!propHandler.holdingProp)
                {
                    Transform  handlerTran = propHandler.muscles[0].transform;
                    RaycastHit raycastHit;
                    if (Physics.SphereCast(hp.rigidRoot.position, 0.5f, ac.am.cameraHandler.transform.forward, out raycastHit, 2.0f, LayerMask.GetMask("weapon"), QueryTriggerInteraction.Ignore))
                    {
                        ac.am.LockOn(raycastHit.collider.transform);// 视角的局部锁定
                        float distance = Vector3.Distance(hp.rigidRoot.position, raycastHit.collider.transform.position);
                        handChain.reach = Mathf.MoveTowards(handChain.reach, 0.375f * distance, 0.05f);
                        handChain.pull  = Mathf.MoveTowards(handChain.pull, 0.375f * distance, 0.05f);
                        IKWeight        = 1.0f;
                        //humanoidParts.aimPart.position = Vector3.MoveTowards(humanoidParts.aimPart.position, raycastHit.collider.attachedRigidbody.position, 0.1f);
                        hp.aimPart.GetComponent <Rigidbody>().MovePosition(Vector3.MoveTowards(hp.aimPart.position, raycastHit.collider.attachedRigidbody.position, 0.05f));
                        //humanoidParts.GetBodyPart(HumanBodyBones.RightHand).rigidbody.isKinematic = true;


                        float d = Vector3.Distance(handlerTran.position, raycastHit.collider.attachedRigidbody.position);
                        if (d <= 0.5f && propHandler.currentProp == null)
                        {
                            //TEST
                            //通过使用  IK target 来作为 spring joint 的连接起点 去连接武器手柄
                            //am.targetTest.transform.position = raycastHit.collider.attachedRigidbody.position;
                            ac.IgnoreHWCollision(raycastHit.collider, true);
                            Rigidbody r = hp.aimPart.GetComponent <Rigidbody>();
                            r.MovePosition(raycastHit.collider.attachedRigidbody.position);
                            r.velocity        = Vector3.zero;
                            r.angularVelocity = Vector3.zero;
                            r.GetComponent <IKTarget>().updateRot();
                            propHandler.holdingProp = raycastHit.collider.gameObject.GetComponentInParent <PropBase>();
                            if (!propHandler.holdingProp.IsStabIn)// 武器不处于插入状态
                            {
                                propHandler.currentProp = propHandler.holdingProp;
                                handAction      = Global.HandAction.FREE;
                                handChain.reach = 0.0f;
                                handChain.pull  = 0.0f;
                                isPicking       = false; propHandler.holdingProp = null;
                                // 解除视角的局部锁定
                                ac.am.unLock();
                                return;
                            }
                            return;
                        }
                    }
                    else
                    {
                        handChain.reach = 0.0f;
                        handChain.pull  = 0.0f;
                        return;
                    }
                }
                else
                {
                    Collider weaponCollider = propHandler.holdingProp.GetComponentInChildren <Collider>();
                    ac.IgnoreHWCollision(weaponCollider, true);
                    ac.am.LockOn(weaponCollider.transform);
                    float distance = Vector3.Distance(hp.rigidRoot.position, propHandler.holdingProp.transform.position);
                    if (!propHandler.holdingProp.IsStabIn)
                    {
                        ac.IgnoreHWCollision(weaponCollider, false);
                        hp.propHandlers[0].currentProp = propHandler.holdingProp;
                        if (handAction == Global.HandAction.FETCH)
                        {
                            handAction = Global.HandAction.FREE;
                        }
                        handChain.reach         = 0.0f;
                        handChain.pull          = 0.0f;
                        propHandler.holdingProp = null;
                        // 解除视角的局部锁定
                        ac.am.unLock();
                        Vector3 force = hp.rigidRoot.InverseTransformVector(ac.viewXY);
                        hp.GetBodyPart(HumanBodyBones.RightHand).rigidbody.AddForce(force * 10, ForceMode.Impulse);
                        return;
                    }
                    else if (distance >= hp.GetMuscleGroup(HumanoidParts.MucleGroupIndex.RHAND).muscleLength * 1.8f) // 如果距离大于1.5倍的单臂长
                    {
                        ac.am.unLock();
                        propHandler.holdingProp = null;
                        propHandler.currentProp = null;
                        handAction      = Global.HandAction.FREE;
                        handChain.reach = 0.0f;
                        handChain.pull  = 0.0f;
                        return;
                    }
                    handChain.reach = Mathf.MoveTowards(handChain.reach, 0.375f * distance, 0.05f);
                    handChain.pull  = Mathf.MoveTowards(handChain.pull, 0.375f * distance, 0.05f);
                    hp.aimPart.GetComponent <Rigidbody>().MovePosition(propHandler.holdingProp.r.position);
                    keepHandState = true; //不更新state的手部动作
                    if (handAction == Global.HandAction.SLASH)
                    {
                        Vector3 force = hp.rigidRoot.InverseTransformVector(ac.viewXY);
                        //施加力量 来提起武器
                        propHandler.holdingProp.r.AddForce(force * 400, ForceMode.Force);
                    }
                }
            }