/// <summary> /// フックをひっかける /// </summary> /// <param name="joint">フックとなる joint</param> /// <param name="target">フックをひっかける対象</param> void Hook(ConfigurableJoint joint, GrapplingTargetController target) { Rigidbody rb = target.GetComponent <Rigidbody>(); if (rb) { joint.connectedBody = rb; joint.xMotion = ConfigurableJointMotion.Limited; joint.yMotion = ConfigurableJointMotion.Limited; joint.zMotion = ConfigurableJointMotion.Limited; if (m_wireSfx) { m_audio.PlayOneShot(m_wireSfx); } } else { Debug.LogErrorFormat("{0} doesn't have Rigidbody.", target.name); } }
void Update() { GameObject player = GameObject.FindGameObjectWithTag("Player"); if (!player) { return; } m_targets.Clear(); // 現在のターゲットから画面から消えた、または射程距離外に外れたら、ターゲットを消す if (m_target && (!m_target.IsHookable || Vector3.Distance(m_target.transform.position, player.transform.position) > m_targetRange)) { m_target = null; Debug.Log("target lost."); } // 画面に映っている、かつ射程距離内にある GrapplingTarget を全て取得し、リストに入れる GrapplingTargetController[] targets = transform.GetComponentsInChildren <GrapplingTargetController>(); foreach (GrapplingTargetController t in targets) { if (t.IsHookable && Vector3.Distance(player.transform.position, t.transform.position) < m_targetRange) { m_targets.Add(t); } } // 現在のターゲットがない時は、一番近いものをターゲットとする if (!m_target && m_targets.Count > 0) { m_target = m_targets.OrderBy(target => { return(Vector3.Distance(player.transform.position, target.transform.position)); }).First(); m_crosshair.GetComponent <Animator>().Play("CrosshairTargeted"); // アニメーションを再生する if (m_cursorSfx) { m_audio.PlayOneShot(m_cursorSfx); } Debug.Log(m_target.name + " is current target"); } // ボタンを押したらターゲットにフックをひっかける ConfigurableJoint joint = player.GetComponent <ConfigurableJoint>(); if (Input.GetButtonDown("Fire2")) { if (joint.connectedBody) { LoseHook(joint); } else if (m_target) { Hook(joint, m_target); } } // 照準でターゲットを捉える if (m_target) { AimTarget(m_target.transform.position); if (joint.connectedBody) { DrawWire(joint.transform.position + joint.anchor, m_target.transform.position); } } else { HideCrosshair(); } }