void UpdateShoot() { RaycastHit hitInfo; float moveDis = mRopeGun.bulletSpeed * Time.deltaTime; if (Physics.Raycast(m_LastHookPos, m_ShootDir, out hitInfo, 10, -1, QueryTriggerInteraction.Ignore) && hitInfo.distance <= moveDis) { if ((1 << hitInfo.transform.gameObject.layer & mRopeGun.effectLayer.value) != 0 && Vector3.SqrMagnitude(hitInfo.point - mRopeGun.gunMuzzle.position) >= mRopeGun.minDis * mRopeGun.minDis) { mRopeGun.hook.position = m_LastHookPos = hitInfo.point; StartClimb(); } else { mState = HookGunState.Back; } m_Audio = AudioManager.instance.Create(mRopeGun.gunMuzzle.position, mRopeGun.ropeSound, mRopeGun.gunMuzzle, true, false); } else { m_LastHookPos += moveDis * m_ShootDir; if (Vector3.SqrMagnitude(m_LastHookPos - mRopeGun.gunMuzzle.position) >= mRopeGun.range * mRopeGun.range) { mState = HookGunState.Back; m_Audio = AudioManager.instance.Create(mRopeGun.gunMuzzle.position, mRopeGun.ropeSound, mRopeGun.gunMuzzle, true, false); } } UpdateLinePos(); }
public override void DoAction(PEActionParam para) { if (null == mRopeGun) { return; } if (!viewCmpt.hasView) { return; } m_LastHookPos = mRopeGun.hook.position; motionMgr.SetMaskState(PEActionMask.RopeGunShoot, true); mState = HookGunState.Shooting; m_ShootDir = (ikCmpt.aimTargetPos - mRopeGun.gunMuzzle.position).normalized; m_CurrentMoveIndex = 0; PeCamera.SetFloat("Sensitivity Multiplier", 0); AudioManager.instance.Create(mRopeGun.gunMuzzle.position, mRopeGun.fireSound); // Collider[] hitInfos = Physics.OverlapSphere(mRopeGun.gunMuzzle.position, 0.2f, mRopeGun.effectLayer.value, QueryTriggerInteraction.Ignore); // for(int i = 0; i < hitInfos.Length; ++i) // { // if(!hitInfos[i].transform.IsChildOf(entity.transform)) // { // mState = HookGunState.Null; // return; // } // } }
public override bool CostSkill(ISkillTarget target, int sex = 2, bool buttonDown = false, bool buttonPressed = false) { if (!base.CostSkill(target, sex, buttonDown, buttonPressed)) { return(false); } if (mState == HookGunState.Null && buttonDown) { Vector3 shootDir = target.GetPosition() - mGunMuzzle[mCurrentIndex].End.position; shootDir.Normalize(); // if(shootDir.y > 0.17f) // up 10 angle { mState = HookGunState.Shooting; mTargetPos = mHook.transform.position; mCurrentMoveIndex = 0; mShootDir = (target.GetPosition() - mGunMuzzle[mCurrentIndex].End.position).normalized; mOffsetPos = mSkillRunner.transform.position - mGunMuzzle[mCurrentIndex].End.position; List <string> animList = new List <string>(); animList.Add("HoldOnFire"); mSkillRunner.ApplyAnim(animList); mClimpOffset = 1.5f; mHuman.ApplyDurabilityReduce(0); AudioManager.instance.Create(transform.position, mFireSound); return(true); } } return(false); }
void UpdateBulletBackPos() { RaycastHit hitInfo; mHook.transform.position = mTargetPos; float moveDis = mBulletSpeed * Time.fixedDeltaTime; mShootDir = (mGunMuzzle[mCurrentIndex].End.position - mHook.transform.position).normalized; if (Physics.Raycast(mHook.transform.position, mShootDir, out hitInfo)) { if (hitInfo.distance < moveDis) { mState = HookGunState.Null; for (int i = 0; i < mLineList.Count; i++) { mLineList[i].localPosition = Vector3.zero; } mHook.transform.localPosition = Vector3.zero; Invoke("EndClimb", 0.2f); return; } } // mHook.transform.position += moveDis * mShootDir; mTargetPos = mHook.transform.position += moveDis * mShootDir; UpdateLinePos(); }
void StartClimb() { mState = HookGunState.Climbing; anim.SetBool(ClimbAnim, true); phyCtrl.m_SubAcc = Physics.gravity.y * Vector3.down; phyCtrl.useRopeGun = true; phyCtrl._rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous; m_ExDoClimbTime = Time.time + mRopeGun.minClimbTime; Effect.EffectBuilder.Instance.Register(mRopeGun.hitEffectID, null, mRopeGun.hook.position, Quaternion.identity); }
void UpdateBack() { float moveDis = mRopeGun.bulletSpeed * Time.deltaTime; Vector3 dir = mRopeGun.gunMuzzle.position - m_LastHookPos; if (dir.sqrMagnitude <= moveDis * moveDis) { mState = HookGunState.Null; mRopeGun.hook.localPosition = Vector3.zero; ResetLine(); } else { m_LastHookPos += moveDis * dir.normalized; UpdateLinePos(); } }
void UpdateBulletShootPos() { RaycastHit hitInfo; mHook.transform.position = mTargetPos; float moveDis = mBulletSpeed * Time.fixedDeltaTime; if (Physics.Raycast(mHook.transform.position, mShootDir, out hitInfo)) { if (hitInfo.distance < moveDis) { if (hitInfo.transform.gameObject.layer == Pathea.Layer.VFVoxelTerrain) { mTargetPos = hitInfo.point; mState = HookGunState.Climbing; List <string> anim = new List <string>(); anim.Add("GrapplingStart"); mSkillRunner.ApplyAnim(anim); mClimpOffset = 1.5f; if (null != mSkillRunner.GetComponent <Rigidbody>()) { mSkillRunner.GetComponent <Rigidbody>().isKinematic = true; } return; } else if (!hitInfo.collider.isTrigger) { mState = HookGunState.Back; return; } } } mTargetPos = mHook.transform.position += moveDis * mShootDir; if (Vector3.Distance(mHook.transform.position, mGunMuzzle[mCurrentIndex].End.position) > mRange) { mState = HookGunState.Back; } UpdateLinePos(); }
void UpdateClimbing() { Vector3 projectPos = Vector3.zero; for (; m_CurrentMoveIndex < mLinePosList.Count - 1; ++m_CurrentMoveIndex) { Vector3 indexDir = mLinePosList[m_CurrentMoveIndex + 1] - mLinePosList[m_CurrentMoveIndex]; Vector3 currentDir = mRopeGun.gunMuzzle.position - mLinePosList[m_CurrentMoveIndex]; Vector3 projectDir = Vector3.Project(currentDir, indexDir); if (projectDir.sqrMagnitude < PETools.PEMath.Epsilon || Vector3.Angle(projectDir, indexDir) > 90f || projectDir.sqrMagnitude < indexDir.sqrMagnitude) { projectPos = mLinePosList[m_CurrentMoveIndex] + projectDir; break; } } if (phyCtrl.velocity.magnitude > 5f * mRopeGun.climbSpeed || Vector3.SqrMagnitude(trans.position - m_LastHookPos) > 40000f) { trans.position = m_LastHookPos + 2f * Vector3.up; mState = HookGunState.Null; ResetPhy(); return; } if (m_CurrentMoveIndex == mLinePosList.Count - 1 || Vector3.SqrMagnitude(projectPos - m_LastHookPos) <= 0.25f || (Time.time >= m_ExDoClimbTime && phyCtrl.grounded)) { mState = HookGunState.Null; ResetPhy(); return; } mRopeGun.hook.position = m_LastHookPos; Vector3 targetToProjectPos = projectPos - m_LastHookPos; Vector3 targetToHookPos = mRopeGun.gunMuzzle.position - m_LastHookPos; float angle = Vector3.Angle(targetToHookPos, targetToProjectPos); if (angle > PETools.PEMath.Epsilon) { Vector3 normal = Vector3.Cross(targetToProjectPos.normalized, targetToHookPos.normalized); Quaternion rot = Quaternion.AngleAxis(angle, normal); for (int i = m_CurrentMoveIndex; i < mLinePosList.Count - 1; ++i) { Vector3 dir = mLinePosList[i] - m_LastHookPos; dir = rot * dir; mLinePosList[i] = dir + m_LastHookPos; } } Vector3 moveDir = Vector3.Normalize(mLinePosList[m_CurrentMoveIndex + 1] - mLinePosList[m_CurrentMoveIndex]); phyCtrl.m_SubAcc = moveDir.y > 0 ? Physics.gravity.y * Vector3.down : Vector3.zero; phyCtrl.ResetSpeed(((moveDir.y > 0)?1f:mRopeGun.moveDownSpeedScale) * mRopeGun.climbSpeed); phyCtrl.desiredMovementDirection = moveDir; for (int i = 0; i < mRopeGun.lineList.Count; i++) { if (i < m_CurrentMoveIndex + 1) { mRopeGun.lineList[i].localPosition = Vector3.zero; } else { mRopeGun.lineList[i].position = mLinePosList[i]; } } }
void UpdateUserPos() { Vector3 StartPos = mLinePosList[mCurrentMoveIndex]; Vector3 EndPos = mLinePosList[mCurrentMoveIndex + 1]; Vector3 Dir = EndPos - StartPos; mOffsetPos = mSkillRunner.transform.position - mGunMuzzle[mCurrentIndex].End.position; float MoveDis = mPushSpeed * Time.fixedDeltaTime; mCurrentMoveDis += MoveDis; PhysicsCharacterMotor pcM = mSkillRunner.GetComponent <PhysicsCharacterMotor>(); if (null != pcM) { if (!pcM.GetComponent <Rigidbody>().isKinematic) { pcM.GetComponent <Rigidbody>().velocity = Vector3.zero; } mClimpOffset -= Time.fixedDeltaTime; if (mClimpOffset < 0f && pcM.grounded) { mSkillRunner.transform.position = EndPos; mState = HookGunState.Null; for (int i = 0; i < mLineList.Count; i++) { mLineList[i].localPosition = Vector3.zero; } mHook.transform.localPosition = Vector3.zero; Invoke("EndClimb", 0.2f); if (Vector3.Distance(EndPos, mHook.position) < 1f) { Ray ray = new Ray(mHook.position + 0.5f * Vector3.up, mSkillRunner.transform.forward); if (!Physics.Raycast(ray, 0.5f)) { mSkillRunner.transform.position = mHook.position + 0.5f * (Vector3.up + mSkillRunner.transform.forward); } } else { Ray ray = new Ray(mSkillRunner.transform.position + 0.5f * Vector3.up, mSkillRunner.transform.forward); if (!Physics.Raycast(ray, 0.5f)) { mSkillRunner.transform.position = mSkillRunner.transform.position + 0.5f * (Vector3.up + mSkillRunner.transform.forward); } } return; } } if (mCurrentMoveDis > Dir.magnitude) { if (mCurrentMoveIndex == mLinePosList.Count - 2) // endMove { mSkillRunner.transform.position = EndPos; mState = HookGunState.Null; for (int i = 0; i < mLineList.Count; i++) { mLineList[i].localPosition = Vector3.zero; } mHook.transform.localPosition = Vector3.zero; Invoke("EndClimb", 0.2f); Ray ray = new Ray(mHook.position + 0.5f * Vector3.up, mSkillRunner.transform.forward); if (!Physics.Raycast(ray, 0.5f)) { mSkillRunner.transform.position = mHook.position + 0.5f * (Vector3.up + mSkillRunner.transform.forward); } return; } else { mCurrentMoveDis -= Dir.magnitude; mCurrentMoveIndex++; StartPos = mLinePosList[mCurrentMoveIndex]; EndPos = mLinePosList[mCurrentMoveIndex + 1]; Dir = EndPos - StartPos; } } mSkillRunner.transform.position = StartPos + Dir.normalized * mCurrentMoveDis + mOffsetPos; for (int i = 0; i < mLineList.Count; i++) { if (i < mCurrentMoveIndex + 1) { mLineList[i].position = mGunMuzzle[mCurrentIndex].End.position; } else { mLineList[i].position = mLinePosList[i]; } } }