IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity2D:添加敌人AI——移动、动画、消灭、hurt效果 -> 正文阅读

[游戏开发]unity2D:添加敌人AI——移动、动画、消灭、hurt效果

注:该文为学习笔记,具体请看b站upMichael-Studio的unity教程2D入门:13敌人Enemy!

环境:unity2020.3

敌人效果:若玩家碰到敌人会掉血,若玩家踩到敌人的头上,则可以将敌人消灭

准备工作

1.将素材导入

2.将素材尺寸调整好——Pixels Per Unit

即每个小格代表多大的像素

开始

?3.创建2Dsprite

4.给该sprite添加图片,一般默认是最常用的一张图——Sprite属性

另外如果不显示,则需要调整sorting layer

?

添加重力效果和碰撞组件

5.添加Rigidbody2D 和 collider

如果是tile碰撞体记得锁定RigidBody的z轴

添加动画效果

6.添加animator

7.在asset中创建一个新的animator controller,并赋值给animator的Controller属性

?具体添加动画的内容不再赘述

消灭敌人

该函数为内置的函数,意为:当碰到2D碰撞体时执行

为了实现“踩到敌人将敌人消灭”我的判断条件是当Player的动画状态是falling时...判断条件不唯一,根据需要来

如果不是falling的状态则做出另外的反应(代码省略)

?如果想要游戏有更好的体验,可以在消灭敌人后有一些小反馈,比如反作用力向上起跳一小段

?

受伤Hurt效果

首先hurt动画需要读者自己给Player添加好

?Plyer:? 被撞到后往后弹一段距离,切换Hurt动画并掉血

首先,这部分代码写在刚才else的括号中,如果想要有回弹的效果,本质上是改变了velocity,但是在update中不断的调用左右移动的函数,在该函数中的velocity改变值没来得及实现就被盖过去了,为了防止这种情况出现,我们需要这样做。

首先,else部分添加如下代码

?注:ishurt为一个bool值,可以帮助我们在hurt期间先停止左右移动的刷新,只需在update中如下写

什么时候才可以让ishurt重归为false呢?

移动一段距离、经历一段时间、又或是velocity的速度减小为0

这里用的是最后一个方法,请注意,最后一个方法默认的是有摩擦力,也就是速度确实是在不断减小的,我们可以把Player-->Rigidbody-->linear Drag改大一些

然后写下面的代码:↓

?

至于这几行代码该写在哪里?写在update中或者update调用的任意一个函数中,这里我写在了统一改变Player状态的函数中

?接下来,Player切换受伤效果动画

1.需要添加一个bool参数hurt

2.动画间的关系如下,idle、run、jump都可能切换到hurt状态

3.切换时的参数调整记得注意

?最后hurt应该能回到状态idle 条件为 hurt==false&&idle==true

其他地方不用改,此处改几行代码即可

?

?

?

?PlayerControleer代码如下,需要自取

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//控制角色的移动
//控制物品的收集

public class PlayerControler : MonoBehaviour
{
    //获取刚体
    private  Rigidbody2D rb;//物理
    private  Animator  Anim;//动画
    private bool getCherry=false;
    private bool ishurt=false;


    public float speed;
    public float  Jumpforce;
    public LayerMask Groud;//LayerMask是获得图层的
    public Collider2D Coll;//player's colliderBox
    public int Cherry=0;//吃到的cherry的个数

    //UI
    public Text Cherrynumber;



    // Start is called before the first frame update
    void Start()
    {
        rb=GetComponent<Rigidbody2D>();
        Anim=GetComponent<Animator>();
    }

    // Update is called once per frame
    void FixedUpdate()//
    {
        if(ishurt==false)
            Movement();
        SwitchAnim();
        if(getCherry)
        {
            Cherry+=1;
            getCherry=false;
            Cherrynumber.text=Cherry.ToString();
        }
    }

    void Movement()
    {
        float Horizontalmove=Input.GetAxis("Horizontal");//获得玩家横向的输入 -1:left 0:static 1:right 是有-1--1的小数的
        float FaceDirection=Input.GetAxisRaw("Horizontal");//Row可以直接获得-1.0.1的整数
        //角色移动
        if(Horizontalmove!=0)
        {
            rb.velocity=new Vector2(Horizontalmove*speed*Time.deltaTime,rb.velocity.y);//Time.deltaTime单位时间
            Anim.SetFloat("running",Mathf.Abs(Horizontalmove));//调用动画的代码  改动相应的 参数
        }else
        {
            Anim.SetFloat("running",0);//如果不回复的话,running的值会一直在
        }
        //根据 向左向右移动反转身体
        if(FaceDirection!=0)
        {
            transform.localScale=new Vector3(FaceDirection,1,1);//直接用的transform 就是挂脚本的组件的
        }
        //跳跃
        if(Input.GetButtonDown("Jump"))
        {
            if(Coll.IsTouchingLayers(Groud))
            {
                rb.velocity=new Vector2(rb.velocity.x,Jumpforce*Time.deltaTime);
                Anim .SetBool("jumping",true);
                Anim .SetBool("idle",false);
            }
        }
        
    }

    void SwitchAnim()
    {
        if(Anim.GetBool("jumping"))
        {
            if(rb.velocity.y<0)
            { 
                Anim .SetBool ("jumping",false);
                Anim .SetBool ("falling",true);
            }
        }
        else if(ishurt)
        {
            Anim.SetBool("hurt",true);
            if(Mathf.Abs(rb.velocity.x)<0.1f)
            {
                Anim.SetBool("hurt",false);
                Anim.SetBool("idle",true);
                ishurt=false;
            }
        }
        else if(Coll.IsTouchingLayers(Groud ))
        {
            Anim.SetBool("falling",false);
            Anim.SetBool ("idle",true);
        }
    }

    //捡起樱桃
    private void OnTriggerEnter2D(Collider2D obj) 
    {
        if(obj.tag=="Collection")
        {
            Destroy(obj.gameObject);
            getCherry=true;
        }
    }

    //消灭敌人
    private void OnCollisionEnter2D(Collision2D other) 
    {
        
        if(other.gameObject.tag=="enemy")
        {
            //只有掉落的时候才会消失
            if(Anim.GetBool("falling"))
            {
                Destroy(other.gameObject);
                rb.velocity=new Vector2(rb.velocity.x,Jumpforce*Time.deltaTime);
                Anim.SetBool("jumping",true);
            }
            //enemy在左侧 向左后退
            else if(transform.position.x<other.gameObject.transform.position.x)
            {
                rb.velocity=new Vector2(-5,rb.velocity.y);
                ishurt=true;            
            }
            //同理
            else if(transform.position.x>other.gameObject.transform.position.x)
            {
                rb.velocity=new Vector2(5,rb.velocity.y);
                ishurt=true;
            }
        }
    }
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 13:01:39  更:2021-08-18 13:02:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 17:43:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码