首页 > 其他分享 >Unity 麦扣 x 勇士传说 全解析 之 怪物基类(2)(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

Unity 麦扣 x 勇士传说 全解析 之 怪物基类(2)(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

时间:2024-08-19 12:23:44浏览次数:13  
标签:void private physicscheck Unity 麦扣 rb new 牢弟 public

1.怪物的动画逻辑一览

2.怪物的受伤死亡逻辑一览

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

public class Monster : MonoBehaviour
{
    [Header("速度")]
    public float normalSpeed;
    public float chaseSpeed;
    public float currentSpeed;
    [Header("面朝向")]
    protected Vector3 headFor;
    [Header("等待计时器")]
    public float waitTime;
    public float waitClock;
    public bool waitState;
    [Header("组件")]
    protected Rigidbody2D rb;
    protected Animator animator;
    protected PhysicsCheck physicscheck;

    private bool isWalk;
    private bool run;

    //当前移动
    private Transform attacker;
    //怪物受伤
    private bool isHurt;
    //受伤受到击退的力
    public float hurtForce;
    //死亡
    public bool isDead;
    private void Awake() {
        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
        physicscheck = GetComponent<PhysicsCheck>();
       
    }
    private void Update() {

        //实时面朝向
        headFor = new Vector3(-this.transform.localScale.x,0,0);
        if ((headFor.x > 0 && physicscheck.isRightWall) || (headFor.x < 0 && physicscheck.isLeftWall)) {
            waitState = true;
            animator.SetBool("walk", false);
        }
        //延迟转身
        WaitAndTurn();
    }
    private void FixedUpdate() {
        if (!isHurt&&!isDead)
        {
            Move();
        }
       
    }
    //移动方法
    protected virtual void Move()
        {
        //移动算式
        rb.velocity=new Vector2( currentSpeed* headFor.x*Time.deltaTime,rb.velocity.y);
        if(!(physicscheck.isLeftWall&& physicscheck.isRightWall))
         {isWalk = true;
        animator.SetBool("walk", isWalk); }
        else
            {
            isWalk = false;
        }
    }
    //撞墙等待转身方法
    protected void WaitAndTurn()
        { 
    if(waitState)
            {
            waitClock -= Time.deltaTime;
            if(waitClock<= 0)
                {
                waitState=false;
                waitClock = waitTime; // 重置计时器
                this.transform.localScale = new Vector3(headFor.x,1,1);
            }       
        }
    
    }
    //受击后转身
    public void OnTakeDamage(Transform attcakTrans)
        {
        attacker = attcakTrans;
        if (attcakTrans.position.x - this.transform.position.x > 0)
            transform.localScale = new Vector3(-1, 1, 1);
        if (attcakTrans.position.x - this.transform.position.x < 0)
            transform.localScale = new Vector3(1, 1, 1);
        //受伤动画
        isHurt =true;
        animator.SetTrigger("IsHurt");
        //加力方向
        Vector2 dir = new Vector2(this.transform.position.x- attcakTrans.transform.position.x,0).normalized;
        StartCoroutine(OnHurt(dir));
    }
    private IEnumerator OnHurt(Vector2 dir)
        {
        rb.velocity = Vector2.zero; // 重置速度
        rb.AddForce(dir * hurtForce, ForceMode2D.Impulse);
        Debug.Log("Force applied: " + (dir * hurtForce)); // 添加调试信息
        yield return new WaitForSeconds(0.5f);
        isHurt = false;
    }
    public void Ondead() {
        isDead = true;
        animator.SetBool("dead",isDead);        
    }
    //死亡后销毁怪物
    public void DestoryMonseter()
        {
        Destroy(this.gameObject);
    }
}

标签:void,private,physicscheck,Unity,麦扣,rb,new,牢弟,public
From: https://blog.csdn.net/2301_77947509/article/details/141299159

相关文章

  • Unity 中 Color 与 Color32 的区别
    1.存储方式Color用四个浮点数(float)来表示RGBA,取值范围均是0到1举例:varorange=newColor(1f,0.5f,0f,1f);而Color32使用四个字节(byte)表示RGBA,取值范围是0到255举例:varorange=newColor32(255,128,0,255);2.区别由存储方式可以看出,Color32采用字节存储,占......
  • unity中的问题记录(角色的控制)
    unity中的默认访问修饰符与c#相同,class不写public,则默认同一程序集(internal)中可以访问,在unity中,程序集表现为项目,即同一项目可以互相访问类里的成员默认与c#同样相同,都是private在C#中,将字段和方法都设为私有(private)并使用static修饰符并不是“多此一举”,而是根据具体的设......
  • Unity 常用的生命周期函数
    publicclassMonoLife:MonoBehaviour{  privatevoidAwake()  {    print("Awake:只要物体显示状态为true则调用一次");  }  privatevoidOnEnable()  {    print("OnEnable:每一次物体启用时调用");  }  private......
  • Unity项目优化记录
    背景:测试反馈项目组游戏存在内存泄露,来找到中台这边协调排查。好家伙,跑了两次看了内存快照,再看资源组织和管理方式,存在的问题确实比较多。1、修复内存泄露:结算界面由于资源引用丢失导致整个面板不会被释放,每次泄漏50MB左右的内存。2、改进资源卸载,通过引用计数管理资源,当引用......
  • Unity 刚体 AddForce 的几种力类型
    今天在实现2D横版跳跃的时候,发现使用AddForce添加的力太突兀了,没有逐渐向上的过程,发现AddForce还有ForceModemode参数以下部分内容摘自BingCopilot总结Unity官网文档1.ForceMode.Force(默认值)描述:施加一个连续的力,考虑物体的质量效果:物体会逐渐加速,力的大小和方向......
  • 【unity2022与html交互】
    一、安装untiy1.官网下载https://unity.com/cn/download,这个类似于untiy管理器,很多版本都可以下2.安装后登陆账号,网页跳转登陆,然后登陆后进入软件页面选择要下载的版本,建议2022lst版本3.下载后,在网页上使用还需要添加模块WEBGL,还有一个中文汉化模块也可以下载 二、模型......
  • Unity 麦扣 x 勇士传说 全解析 之 怪物基类与野猪(附各模块知识的链接,零基础也包学会的
    通过一阵子的学习,我是这么认为的,因为该教程是难度两星的教程 ,也就是适合学了一阵子基础组件以后的学习者(什么都不会的学习者要是学这套课程会困难重重,如果你什么都不会那么需要学习一星教程)所以该课程没有那么多manger,代码也不那么面向对象,但是从怪物类之后就开始有相关的内......
  • 【Unity/网络】Unity和内网穿透的网络测试 —— 以聊天室为例
    这两天在做那个CodeMonky的胡闹厨房的案例,一直困扰我的是关于Lobby和Relay的相关网络服务,需要挂加速器并且延迟不低,所以我一直在寻找一些其他替代方案,想起来之前做一个UEC++的网络枪战时做过一个内网穿透的方法,所以在Unity中也采用这个方案,但中间怎么改IP和端口都没法连接成......
  • Unity FPSSample Demo研究
    1.前言 UnityFpsSampleDemo大约是2018发布,用于官方演示MLAPI(NetCode前身)+DOTS的一个FPS多人对战Demo。Demo下载地址(需要安装GitLFS):https://github.com/Unity-Technologies/FPSSample下载完成后3-40GB左右,若大小不对可能下载不完整。 时间原因写的并不完整,但大致描......
  • unity游戏源码和教程:智能分析话语的三维唯美世界
    我不想和任何人说话,大家不要打扰我。这个游戏的源码(含教程文档)我放到了夸克网盘https://pan.quark.cn/s/618fb9459029小区:小区傍晚的雪:小区的晚上:家里:市中心:市街道:郊区:(一)声明小区场景的三维模型来自于UnityStore的unity包:LowPolyJapaneseHousingComplex。很......