【Unity自学之路】12 - 受伤效果

这篇博客详细介绍了Unity中实现玩家控制器的脚本,包括角色的移动、跳跃、碰撞检测以及动画状态切换。玩家控制器使用Rigidbody2D进行物理模拟,通过Input.GetAxisRaw获取用户输入来控制角色移动和跳跃。同时,脚本还处理了角色与地面、收集物以及敌人的碰撞交互,实现了受伤效果和生命值显示。
摘要由CSDN通过智能技术生成

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

public class PlayerController : MonoBehaviour

{

 

    private Rigidbody2D rb;

    public float speed;

    public float jumpforce;

    private Animator anim;

    public LayerMask Ground;

    public Collider2D coll;

    public CircleCollider2D coll2;

    public int Cherry;

    private bool isHurt = false;//默认false,即使不赋值

 

    //创建一个text实例化对象(using UnityEngine.UI;

    public Text CheeryNum;

    //接着会在检查工具里出现cheerynum这个对象

    //number拖进去

 

 

 

 

 

    // Start is called before the first frame update

    void Start()

    {

 

        rb = GetComponent<Rigidbody2D>();

        anim = GetComponent<Animator>();

 

 

    }

 

    void Update()

    {

        if (!isHurt)

        {

            Movement();

        }

        //如果单纯用这样一个语句来判断

        //后续的内容没有将isHurt变为false的条件

        //因此我们需要动点手脚

 

        SwitchAnim();

        truehurt();

 

 

    }

 

    void truehurt()

    {

        if (Mathf.Abs(rb.velocity.x) < 0.1f)

        {

            isHurt = false;

            anim.SetBool("hurt", false);

        }

    }

 

 

    void Movement()

    {

        float horizontalmove;

        float direction = Input.GetAxisRaw("Horizontal");

        //GetAxis不同的是,这个只获取-1 || 0 || 1 这三个整数

        // Input.GetAxis 当按下你设置的建则会返回一个类似加速度的值

 

        horizontalmove = Input.GetAxis("Horizontal");

        //-1 向左, 1向右,0就是不动

 

 

        //角色移动

        if (horizontalmove != 0)

        {

            rb.velocity = new Vector2(horizontalmove * speed * Time.deltaTime, rb.velocity.y);

            //刚体的速度 = Vector2 (X轴上速度的变化[方向*速率*物理时钟运行百分比=速度]Y轴上速度的变化)

            //          2D平面上的速度变化)

 

            //anim中的running变量(刚刚在unity创建的)设置一个值

            anim.SetFloat("running", Mathf.Abs(direction));

            //为了避免向右向左等改变方向使得值变成负值,我们需要绝对值操作

 

        }

        if (direction != 0)

        {

            transform.localScale = new Vector3(direction, 1, 1);

            //因为这个localscale包含三个维度的值

        }

 

 

        //角色跳跃

        if (Input.GetButtonDown("Jump") && coll2.IsTouchingLayers(Ground))

        {

            rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);

 

            anim.SetBool("jumping", true);

 

 

 

        }

    }

 

    void SwitchAnim()

    {

 

        anim.SetBool("idle", false);

        //进入switchanim中,要首先将idel设置为false。具体看下文

        if (anim.GetBool("jumping"))

        {

 

            if (rb.velocity.y < 0)

            {

                anim.SetBool("jumping", false);

                anim.SetBool("falling", true);

            }

 

        }

        else if (coll2.IsTouchingLayers(Ground))

        {

            anim.SetBool("falling", false);

            anim.SetBool("idle", true);//如果只是设置这一句的话,当他掉落地面后会一直保持ideltrue的效果

                                       //因此进入switchanim中,要首先将idel设置为false

        }

 

    }

 

    private void OnTriggerEnter2D(Collider2D collision)

    {

        if (collision.tag == "Collection")

        {

            Destroy(collision.gameObject);

            Cherry = Cherry + 1;

            CheeryNum.text = Cherry.ToString();

        }

    }

 

 

    //对于触发敌人的效果,不能使用on trigger,因为敌人是一直接触地面的

    //如果使用,那么敌人就会立刻由于触碰地面而消失

    private void OnCollisionEnter2D(Collision2D collision)

    //这个内置的参数就是碰撞体

    {

        //游戏角色碰撞到敌人是大条件

        if (collision.gameObject.tag == "Enemey")

        {

 

 

            if (anim.GetBool("falling"))

            {

                Destroy(collision.gameObject);

                rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);

                anim.SetBool("jumping", true);

            }

            //如果游戏角色在青蛙的左侧

            else if (transform.position.x < collision.gameObject.transform.position.x)

            {

                //创建一个新速度向量

                rb.velocity = new Vector2(-10, rb.velocity.y);

                //但是注意,在movement class里面

                //速度是不断的刷新的,所以很难会执行上述代码(线程冲突?)

                //因此需要在update中判断一下是否执行movement动作

 

                anim.SetBool("hurt", true);

 

                isHurt = true;

            }

            // 如果游戏角色在青蛙的右侧

            else if (transform.position.x > collision.gameObject.transform.position.x)

            {

                rb.velocity = new Vector2(10, rb.velocity.y);

                anim.SetBool("hurt", true);

                isHurt = true;

            }

 

 

           

 

 

 

 

           

        }

 

 

    }

}

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值