コード例 #1
0
    /// <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);
        }
    }
コード例 #2
0
    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();
        }
    }