// 忽略 武器和 人物部分的碰撞 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); }
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); } } }