PlayerContronller(玩家控制)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.UI;
using UnityEngine.SceneManagement;//用于场景重置(第21节视频)


public class PlayerContronller : MonoBehaviour
{

    public Rigidbody2D rb;
    //获取一个2D刚体,名字为rb
    public float speed;
    //获取浮点型的“速度”(带有小数点的)
    public Collider2D coll;
    //获取一个2D瓦片地图碰撞器,名为coll
    public Collider2D DisColl1;
//public Collider2D DisColl2;
//privat epublic Rigidbody2D rb; //设置私有的,(public公开的),在unity看不到选项的
//public Rigidbody2D rb;//

    public float JumpForce;
    //获取跳跃,名为jumpforce
    public Animator anim;
    //获取动画器,名为anim
    public LayerMask ground;
    //获取图层,名为ground。需要把之前的瓦片地图定义为ground
    [SerializeField]//这行代码可观察到cherry的变化
    public int cherry;
    //获取一个整数樱桃数量
    public Text cherryNum;
    //获取文本,用于获得樱桃的数量
    public bool isHurt;//布尔值默认是false
    //设置布尔值,如果受伤了,就不执行下面的内容(全部)
    public bool isGround;//检查是否踩在地面
    private int extraJump;


    //public AudioSource jumpAudio;
    //public AudioSource eatAudio;
    //public AudioSource hitAudio;
    public Transform CellingCheck,GroundCheck;//判断顶点位置,地面点位置
    public Joystick joystick;//触控(暂不用)



    void Start()//播放开始的时候会执行中括号里的内容(Start可以做一些初始化的事情)
    {
        //    rb = GetComponent<Rigidbody2D>(); //设置私有的,在unity看不到选项的

    }


    //void Update()//原本使用Update()。所有每一帧的变化都会在Update里面(Update是循环,每帧都会调用)
    void FixedUpdate()//FixdedUpdate(),固定每一帧的变化,在不同配置的电脑上获得同样的手感,
    {
        if (!isHurt)
        //
        {
            Movement();//为了在画面播放时Movement都能被调动

        }
        SwithAnim();
        isGround = Physics2D.OverlapCircle(GroundCheck.position, 0.2f, ground);
        //检测范围里的碰撞器,是GroundCheck点的左边,误差在0.2f左右,判断的是ground
    }

    private void Update()
    {
        //jump();//暂不用
        crouch();
    cherryNum.text = cherry.ToString();
        newJump();
    }
    /// /////////////////////////////////////////////////////////////////////////////
    void Movement()//设置一个函数名为Movement(函数的基本类型),可在这里添加左右移动,跳跃,蹲...
    {

        float horizontalMove = Input.GetAxis("Horizontal");
        //定义一个浮点型,名为horizontalmove
        //获取横向移动"Horizontal","Horizontal"只有三个参数,-1、0、1(向左/不动/向右)。
        //horizontalmove就等于这个参数
        //Input是玩家可以自己选择的按键

        //手机触控------------
        //float horizontalMove = joystick.Horizontal;//-1~1f
        //float facedircetion = joystick.Horizontal;
        //手机触控------------

        float facedircetion = Input.GetAxisRaw("Horizontal");
        //定义一个浮点型,名为facedircetion(方向)。GetAxisRaw直接获得-1、0、1,而GetAxis是-1到0。


        //角色移动
        //        if (horizontalMove != 0)
        if (horizontalMove != 0 && !anim.GetBool("crouching"))
        //做一个判断的函数if,“()”里面写的是条件,不等于0的时候
        {
            rb.velocity = new Vector2(horizontalMove * speed * Time.fixedDeltaTime, rb.velocity.y);
            //施加力量改变刚体rb的速度(velocity,速度的变化),Vector2是xy轴的变化(Vector3是3D层面的变化)
            //horizontalmove只有正负,乘以速度speed。y轴没变。
            //speed乘以物理时钟的运行的百分比,所以能在不同的设备上都可以获得一个很平滑,不跳帧的一个运动方式
            //移动动画

            anim.SetFloat("running", Mathf.Abs(horizontalMove));
            //获取动画控制器里的running,
            //由于动画器那边设置了条件(移动的条件为大于或少于时播放什么动画)
            //所以用Abs(数学上的绝对值)
            //归0默认是idea
        }
        //蹲着走
        if (horizontalMove != 0 && anim.GetBool("crouching"))

        {
            rb.velocity = new Vector2(horizontalMove * speed / 2 * Time.fixedDeltaTime, rb.velocity.y);
            //施加力量改变刚体rb的速度(velocity,速度的变化),Vector2是xy轴的变化(Vector3是3D层面的变化)
            //horizontalmove只有正负,乘以速度speed。y轴没变。
            //speed乘以物理时钟的运行的百分比,所以能在不同的设备上都可以获得一个很平滑,不跳帧的一个运动方式
            //移动动画

            anim.SetFloat("running", Mathf.Abs(horizontalMove));
            //获取动画控制器里的running,
            //由于动画器那边设置了条件(移动的条件为大于或少于时播放什么动画)
            //所以用Abs(数学上的绝对值)
            //归0默认是idea
        }

        //角色方向
        //---------------------------
        if (facedircetion != 0)
        {
            transform.localScale = new Vector3(facedircetion, 1, 1);
        }
        //---------------------------

        //手机触控------------
        //if (facedircetion > 0f)
        //{
        //    transform.localScale = new Vector3(1, 1, 1);
        //}

        //if (facedircetion < 0f)
        //{
        //    transform.localScale = new Vector3(-1, 1, 1);
        //}
        //手机触控------------

        //“转换”里面的“缩放”里,x轴变-1为向左,1为向右,y和z轴不变

        ////角色跳跃
        //if (Input.GetButtonDown("Jump")&& (coll.IsTouchingLayers(ground))&&!anim.GetBool("crouching"))
        ////判断,获取到键盘上一个键“Jump”被按下的时候
        //{



        //    rb.velocity = new Vector2(rb.velocity.x, JumpForce * Time.deltaTime);
        //    //y轴向上有jumpforce乘以物理时钟的速度,x轴仍然是左右移动
        //    anim.SetBool("jumping", true);
        //    //当得知跳跃起来时,动画变为jumping(只有向上跳的定格动画1帧图)
        //    jumpAudio.Play();
        //}
        //crouch();
    }
    //希望降下来有降下来的动画效果
    
    void SwithAnim()
    //切换动画。单独写一个函数,名为SwithAnim
    {
        //anim.SetBool("idle", false);
        //不需要,因为idle是默认的

        if (rb.velocity.y<0.1f &&!coll.IsTouchingLayers(ground))
        {
            anim.SetBool("falling", true);
        }
            //首先要跳起来才有降下来的动画
            //所以先判断是否跳跃
        if (anim.GetBool("jumping"))
        //要进一步判断,什么时候进行动画
        {
            //anim.SetBool("idle", false);
            //不需要,因为idle是默认的

            if (rb.velocity.y < 0)
            //跳跃的时候,当y轴的力(jumpforce)没了,就下降了
            {
                anim.SetBool("jumping", false);
                anim.SetBool("falling", true);
                //此时有起跳和下降的动画,但不会还原

                //当上面的语句不成立,将执行下面的语句
            }
        }
        else if (isHurt == true)
        {
            anim.SetBool("hurt", true);
            anim.SetFloat("running", 0);
            //给他一个值为0,让他停下
          if (Mathf.Abs(rb.velocity.x) < 0.1f)
            {
                anim.SetBool("hurt", false);
                //anim.SetBool("idle", true);
                //不需要,因为idle是默认的
                isHurt = false;
            }
        }


        else if (coll.IsTouchingLayers(ground))
        //当 碰撞接触到地面groud时
        {
            anim.SetBool("falling", false);
            //anim.SetBool("idle", true);
            //不需要,因为idle是默认的
        }
        //要在两个动画之间的连线处设置jumping为true,
        //代码setbool就是设置jumping 的值,值一样动画就可以切换过去了
        //群友解释
    }


    //触发器
    private void OnTriggerEnter2D(Collider2D collision)
    //括号里的内容只被这个函数调用,而不是全局的变量参数
    {
        //收集樱桃
        //樱桃属于Collection的这个标签
        if (collision.tag == "Collection")
        {
            //eatAudio.Play();

            //Destroy(collision.gameObject);
            //cherry += 1;
            collision.GetComponent<Animator>().Play("isGot");
            //获取collision的动画,播放名为"isGot"的动画

            //cherryNum.text = cherry.ToString();
            //已剪切到Updata,使得更新没有延迟


            //注意!!虽然是调用了cherrtNum,但调用的是他的[文本]而不是它本身!
            //直接写=cherry会报错,提示:无法将类型int转化为string,这时需要加上.ToString()
        }

        if (collision.tag == "DeathLine")
        {
            Invoke("Restart", 2f);
        }
    }



    //消灭敌人

    private void OnCollisionEnter2D(Collision2D collision)
    {

      //if (anim.GetBool("falling")&&(collision.gameObject.tag == "Enemies"))
        if (collision.gameObject.tag == "Enemies")
        //获取跳跃,是真就执行,是假就不执行
        {
            Enemy enemy = collision.gameObject.GetComponent<Enemy>();
            //if (collision.gameObject.tag == "Enemies")
            // 如果直接像收集樱桃写collison.tag是会报错的,
            //因为onTriggerEnter2D和OnCollisionEnter2D是两个完全不同的调用系统
            //所以要先获得Enemise这个项目
            if (anim.GetBool("falling"))
            {
              //Destroy(collision.gameObject);不用这个已被下面的语句代替
                enemy.JumpOn();

                rb.velocity = new Vector2(rb.velocity.x, 200 * Time.deltaTime);
                //踩了就跳一下
                anim.SetBool("jumping", true);
                //再来一段小跳
            }
            else if (transform.position.x < collision.gameObject.transform.position.x)
            {
                //hitAudio.Play();
                SoundMananger.instance.HurtAudio();
                rb.velocity = new Vector2(-5, rb.velocity.y);
//                rb.velocity = new Vector2(rb.velocity.x, 300 * Time.deltaTime);
                isHurt = true;
            }
            else if (transform.position.x > collision.gameObject.transform.position.x)
            {
                //hitAudio.Play();
                SoundMananger.instance.HurtAudio();
                rb.velocity = new Vector2(-5, rb.velocity.y);
 //               rb.velocity = new Vector2(rb.velocity.x, 300 * Time.deltaTime);
                isHurt = true;
            }
        }
    }

    //蹲下
    void crouch()
    {
        if (!Physics2D.OverlapCircle(CellingCheck.position,0.2f,ground))
        {
            if (Input.GetButton("Crouch"))
            {
                anim.SetBool("crouching", true);
                DisColl1.enabled = false;
                //DisColl1这个选项被关闭
            } else
            {
                anim.SetBool("crouching", false);
                DisColl1.enabled = true;
                //DisColl1这个选项被关闭
            }
        }
    }

    //角色跳跃
    /*void jump()
    {
        if (Input.GetButtonDown("Jump") && (coll.IsTouchingLayers(ground)) && !anim.GetBool("crouching"))
        //判断,获取到键盘上一个键“Jump”被按下的时候
        {



            rb.velocity = new Vector2(rb.velocity.x, JumpForce * Time.deltaTime);
            //y轴向上有jumpforce乘以物理时钟的速度,x轴仍然是左右移动
            anim.SetBool("jumping", true);
            //当得知跳跃起来时,动画变为jumping(只有向上跳的定格动画1帧图)
            jumpAudio.Play();
        }
    }*/

        void newJump()
    {
        if (isGround)
        {
            extraJump = 1;
        }
        if (Input.GetButtonDown("Jump") && extraJump > 0)
        {
            rb.velocity = Vector2.up * JumpForce;//new Vector2 (0,1)
            extraJump--;// -1
            anim.SetBool("jumping", true);
            SoundMananger.instance.JumpAudio();
        }
        if (Input.GetButtonDown("Jump") && extraJump == 0 && isGround)
        {
            rb.velocity = Vector2.up * JumpForce;
            anim.SetBool("jumping", true);
            SoundMananger.instance.JumpAudio();
        }
    }




    void Restart()
    {
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
            //重新加载场景(读取获得当前场景的名字)
    }
    public void CherryCount()
    //public是为了其他文件能调用它
    {
        cherry += 1;
    }
}



ozg
发布了12 篇原创文章 · 获赞 0 · 访问量 29

猜你喜欢

转载自blog.csdn.net/qq_34751660/article/details/105615133