//地面にいる場合の移動 void GroundMove() { m_Animator.SetBool("IsString", false); m_Prediction.gameObject.SetActive(false); Vector3 start = transform.position + transform.up * 0.5f; //足元の情報取得(地面優先) if (!Physics.Raycast(start, -transform.up, out m_hitinfo, 1f, m_GroundLayer)) { Physics.Raycast(start, -transform.up, out m_hitinfo, 1f, m_TreeLayer); } if (m_hitinfo.collider.tag == "Tree") { m_StateManager.StateProcassor.State = m_StateManager.TreeTp; return; } //位置補正 transform.position = Vector3.Lerp(transform.position, m_hitinfo.point, 0.2f); Vector3 move = Vector3.zero; if (m_Animator.GetCurrentAnimatorStateInfo(0).IsName("GroundMove")) { move = Move(m_Camera.right, m_hitinfo.normal); } RaycastHit hit; if (Physics.Raycast(start + Vector3.up * m_GroundJumpHeight, transform.forward, out hit, m_GroundJumpForward, m_TreeLayer)) { m_Prediction.gameObject.SetActive(true); m_Prediction.SetParameter(transform.position, hit.point, m_Angle, m_Shooter.m_SideNumber); m_Prediction.Calculation(); if (Input.GetKeyDown(KeyCode.Space) || Input.GetButtonDown("Jump")) { m_hitinfo = hit; move_start = transform.position; move_end = hit.point; m_Prediction.gameObject.SetActive(false); m_Animator.SetTrigger("NormalJump"); JumpCalculation(move_start, move_end, m_Angle); m_StateManager.StateProcassor.State = m_StateManager.GroundJump; return; } } else { m_Prediction.gameObject.SetActive(false); } //木に登る if (Physics.Raycast(start, move, out m_hitinfo, 1f, m_TreeLayer)) { transform.position = m_hitinfo.point; transform.rotation = Quaternion.LookRotation(Vector3.Cross(transform.right, m_hitinfo.normal), m_hitinfo.normal); m_StateManager.StateProcassor.State = m_StateManager.TreeTp; } }
//ジャンプ private void Jump(Ray ray, RaycastHit hit) { isFlyable = false; bool jump = false; bool bodyBlow = false; float addLimit = 0; //糸を狙うのかどうか if (Input.GetKeyUp(KeyCode.K) || Input.GetButtonDown("LB")) { //m_enemy = null; isTargetString = !isTargetString; m_AudioSource.PlayOneShot(m_AudioClips[6]); } if (hit.collider.tag == "Tree") { var tree = hit.collider.GetComponent <Tree>(); if (tree.m_SideNumber == m_Shooter.m_SideNumber) { addLimit = tree.m_TerritoryRate; } } else if (hit.collider.tag == "String") { var s = hit.collider.GetComponent <StringUnit>(); addLimit = Vector3.Distance(s.m_PointA, s.m_PointB); } List <GameObject> jumpable_tree = new List <GameObject>(); jumpable_tree.Add(m_Enemy); foreach (GameObject g in m_trees) { if (Vector3.Distance(transform.position, g.transform.position) < m_JumpLimit + addLimit && g != m_hitinfo.collider.gameObject) { jumpable_tree.Add(g); } } if (isTargetString) { if (!(jump = Physics.Raycast(ray, out jump_target, m_JumpLimit + addLimit, m_NetLayer))) { jump = Physics.SphereCast(ray, 1f, out jump_target, m_JumpLimit + addLimit, m_StringLayer); } } else { jump = Physics.Raycast(ray, out jump_target, m_JumpLimit + addLimit, m_TreeLayer); } if (Input.GetKeyDown(KeyCode.J) || Input.GetButtonDown("RB")) { m_AudioSource.PlayOneShot(m_AudioClips[5]); if (m_jumpableNum == -1) { m_category = TargetCategory.Enemy; m_jumpableNum++; } else if (jumpable_tree.Count >= m_jumpableNum) { if (jumpable_tree.Count - 1 == m_jumpableNum) { m_category = TargetCategory.Connecter; m_jumpableNum = -1; m_Prediction.SetActive(false); return; } else { m_category = TargetCategory.JumpableTree; m_jumpableNum++; } } } if (Input.GetAxis("Horizontal2") != 0 || Input.GetAxis("Vertical2") != 0) { m_category = TargetCategory.Connecter; m_jumpableNum = -1; m_Prediction.SetActive(false); return; } if (m_category == TargetCategory.Enemy) { bodyBlow = true; jump = false; m_JumpMode = JumpMode.Bodyblow; Vector3 dir = m_Enemy.transform.position - m_center; m_CameraPivot.transform.rotation = Quaternion.LookRotation(Vector3.Lerp(m_CameraPivot.transform.forward, dir, 0.1f), Vector3.up); } else if (m_category == TargetCategory.JumpableTree) { bodyBlow = false; jump = true; if (jumpable_tree.Count > m_jumpableNum) { Vector3 posY = new Vector3(0, 10f, 0); Vector3 dir = (jumpable_tree[m_jumpableNum].transform.position + posY) - m_center; m_CameraPivot.transform.rotation = Quaternion.LookRotation(Vector3.Lerp(m_CameraPivot.transform.forward, dir, 0.1f), Vector3.up); Ray ableRay = new Ray(m_center, dir); float dis = Vector3.Distance(m_center, jumpable_tree[m_jumpableNum].transform.position + posY); jump = Physics.Raycast(ableRay, out jump_target, dis, m_TreeLayer); } } if (jump) { if (hit.collider.gameObject == jump_target.collider.gameObject) { if (Vector3.Distance(transform.position, jump_target.point) < jumpLower) { m_Prediction.SetActive(false); return; } } if (jump_target.transform.tag == "String" || jump_target.transform.tag == "Net") { if (jump_target.transform.GetComponent <Connecter>().m_SideNumber != m_Shooter.m_SideNumber) { return; } } float dis = Vector3.Distance(transform.position, jump_target.point); if (dis > m_JumpLimit) { if (hit.collider.tag == "Tree") { m_JumpMode = JumpMode.CapturingJump; } else if (hit.collider.tag == "String") { m_JumpMode = JumpMode.StringJump; } } else { m_JumpMode = JumpMode.NormalJump; } //予測線、カーソル表示 m_Prediction.SetActive(true); m_Prediction.SetParameter(transform.position, jump_target.point, m_Angle, m_Shooter.m_SideNumber, m_JumpMode, m_category); m_Prediction.Calculation(); isFlyable = true; //ジャンプ if (Input.GetKeyDown(KeyCode.Space) || Input.GetButtonDown("Jump")) { m_WindLine.Play(); m_AudioSource.PlayOneShot(m_AudioClips[4]); m_Prediction.SetActive(false); TreeRateMinus(); move_start = transform.position; move_end = jump_target.point; m_Animator.SetTrigger("Jump"); m_Animator.SetBool("IsJump", true); m_escapeInterval = 0; isFlyable = false; if (m_hitinfo.collider != jump_target.collider) { m_treeWaitTime = 0; } JumpCalculation(move_start, move_end, m_Angle); m_StateManager.StateProcassor.State = m_StateManager.JumpTp; } return; } else if (bodyBlow) { //体当たり float len = Vector3.Distance(m_Enemy.transform.position, m_center); var enemy = m_Enemy.GetComponent <EnemyAI4>(); Ray dirRay = new Ray(m_center + transform.forward, (m_Enemy.transform.position - m_center)); bool isAttackable = len < m_JumpLimit && m_hitinfo.collider.gameObject != enemy.nearObj && !Physics.Raycast(dirRay, len - 1f, m_TreeLayer) && enemy.TreeDist(); m_Prediction.SetActive(true); m_Prediction.SetParameter(transform.position, m_Enemy.transform.position, 1f, m_Shooter.m_SideNumber, JumpMode.NormalJump, m_category, isAttackable); m_Prediction.Calculation(); if (isAttackable && (Input.GetKeyDown(KeyCode.Space) || Input.GetButtonDown("Jump"))) { //体当たり実行 m_WindLine.Play(); m_AudioSource.PlayOneShot(m_AudioClips[4]); m_Prediction.SetActive(false); if (m_hitinfo.collider.tag == "Tree") { m_hitinfo.collider.GetComponent <Tree>().m_TerritoryRate -= JumpDemeritRate; } move_start = transform.position; move_end = m_Enemy.transform.position; m_Animator.SetTrigger("Jump"); m_Animator.SetBool("IsJump", false); m_escapeInterval = 0; JumpCalculation(move_start, move_end, m_Angle); m_StateManager.StateProcassor.State = m_StateManager.BodyBlow; } return; } else if (!jump && Physics.Raycast(ray, m_JumpLimit + 100f, m_TreeLayer)) { //届かない場合の予測線描画 m_Prediction.SetActive(true); m_Prediction.SetParameter( transform.position, m_Camera.position + m_Camera.forward * (m_JumpLimit + addLimit), m_Angle, m_Shooter.m_SideNumber, m_JumpMode, TargetCategory.None); m_Prediction.Calculation(); return; } m_Prediction.SetActive(false); m_Prediction.m_HitStringPoint = Vector3.zero; //m_enemy = null; }
//ジャンプ private void Jump(Ray ray, RaycastHit hit) { bool jump = false; //糸を狙うのかどうか if (Input.GetKeyUp(KeyCode.K) || Input.GetButtonUp("RB")) { m_attackTime = 0; m_enemy = null; isCursor = !isCursor; } if (isCursor) { if (!(jump = Physics.Raycast(ray, out jump_target, m_JumpLimit, m_NetLayer))) { jump = Physics.SphereCast(ray, 1f, out jump_target, m_JumpLimit, m_StringLayer); } } else { //jump = Physics.SphereCast(ray, 1f, out jump_target, m_JumpLimit, m_TreeLayer); jump = Physics.Raycast(ray, out jump_target, m_JumpLimit, m_TreeLayer); } if (Input.GetKey(KeyCode.K) || Input.GetButton("RB")) { m_attackTime += Time.deltaTime; if (m_attackTime > 1f) { int playerLayer = LayerMask.GetMask(new string[] { "Player" }); foreach (Collider col in Physics.OverlapSphere(jump_target.point, 3f, playerLayer)) { m_enemy = col; } } } if (jump) { if (hit.collider.gameObject == jump_target.collider.gameObject) { if (Vector3.Distance(transform.position, jump_target.point) < jumpLower) { m_Prediction.gameObject.SetActive(false); return; } } if (jump_target.transform.tag == "String") { if (jump_target.transform.GetComponent <StringUnit>().m_SideNumber != m_Shooter.m_SideNumber) { return; } } if (jump_target.collider.tag == "Net") { if (jump_target.transform.GetComponent <Net>().m_SideNumber != m_Shooter.m_SideNumber) { return; } } //予測線、カーソル表示 m_Prediction.gameObject.SetActive(true); m_Prediction.SetParameter(transform.position, jump_target.point, m_Angle, m_Shooter.m_SideNumber); if (m_enemy != null) { m_Prediction.SetParameter(transform.position, m_enemy.transform.position, m_Angle, m_Shooter.m_SideNumber); } m_Prediction.Calculation(); //ジャンプ if (Input.GetKeyDown(KeyCode.Space) || Input.GetButtonDown("Jump")) { m_Prediction.gameObject.SetActive(false); move_start = transform.position; move_end = jump_target.point; m_Animator.SetTrigger("Jump"); if (m_enemy != null) { Physics.Raycast(m_enemy.transform.position, -m_enemy.transform.up, out jump_target, 1f, m_TreeLayer); move_end = jump_target.point; JumpCalculation(move_start, move_end, m_Angle); m_StateManager.StateProcassor.State = m_StateManager.BodyBlow; return; } JumpCalculation(move_start, move_end, m_Angle); m_StateManager.StateProcassor.State = m_StateManager.JumpTp; } return; } m_Prediction.gameObject.SetActive(false); m_Prediction.m_HitStringPoint = Vector3.zero; m_enemy = null; }