Exemplo n.º 1
0
    //地面にいる場合の移動
    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;
        }
    }
Exemplo n.º 2
0
    //ジャンプ
    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;
    }
Exemplo n.º 3
0
    //ジャンプ
    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;
    }