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

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

时间:2024-08-17 15:54:34浏览次数:11  
标签:Vector2 transform private Unity 麦扣 void 怪物 牢弟 public

通过一阵子的学习,我是这么认为的,因为该教程是难度两星的教程 ,也就是适合学了一阵子基础组件以后的学习者

(什么都不会的学习者要是学这套课程会困难重重,如果你什么都不会那么需要学习一星教程)

所以该课程没有那么多manger,代码也不那么面向对象,但是从怪物类之后就开始有相关的内容了,建议熟练面向对象的知识以后再来学习后面的内容

C# & Unity 面向对象补全计划 之 继承(字段与属性)_unity继承属性-CSDN博客

C# & Unity 面向对象补全计划 之 初识继承方法与多态_unity 类的继承和多态-CSDN博客

C# & Unity 面向对象补全计划 之 接口-CSDN博客

本文实现结果如下 

 

1.怪物基类

思考

1.怪物要有速度,所以设置三种默认速度,追击速度,当前速度

2.怪物要有朝向,可以实时获取当前的朝向

3.怪物要移动,所以需要刚体组件

4.怪物要有动画,所以需要动画组件

5.怪物需要切换速度,所以要追加条件

代码

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

public class Monster : MonoBehaviour
{
    [Header("速度")]
    public float normalSpeed;
    public float chaseSpeed;
    public float currentSpeed;

    [Header("面朝向")]
    private Vector3 headFor;

    [Header("组件")]
    private Rigidbody2D rb;
    private Animator animator;

    private void Awake() {
        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }
    private void Update() {
        //实时面朝向
        headFor = new Vector3(-this.transform.localScale.x,0,0);
    }
    private void FixedUpdate() {
        Move();
    }
    public void Move()
        {
        //移动算式
        rb.velocity=new Vector2( currentSpeed* headFor.x*Time.deltaTime,rb.velocity.y);    
    }
}

2.野猪的动画

思考

1.动画应该以什么条件切换?

        因为怪物不像玩家一样用按键控制加速,是监测范围内出现玩家后,触发追击,反之亦然,所以适合用bool值来切换速度响应状态,也就是切换动画

(当然麦扣老师的考量就是继承怪物类的多种怪物,不靠一种速度模式触发,这样说也合理)

2.撞墙怎么办?

撞墙和检测玩家后切换动画状态属于同一种解决方法,都是用范围检测去判断

问题1

怪物的移动方法与散步逻辑,这里还要加入检测到玩家后跑步逻辑

结合问题2的撞墙范围检测来讲,相信并不难写了 

 //移动方法
 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;
     }
 }

问题2 

撞墙检测

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class PhysicsCheck : MonoBehaviour
{
    //地面检测
    public bool isGround;
    public bool isLeftWall;
    public bool isRightWall;
    //检测半径
    public float raduis;
    //检测层级
    private LayerMask ground;

    //检测偏移量
    [Header("偏移量")]
    public Vector2 positionWithOffset;
    public Vector2 leftOffset;
    public Vector2 rightOffset;
    private void Start() {      
            ground = LayerMask.GetMask("Ground");       
    }
    private void Update() {
        Check();
    }
    private void Check()
        {
        isGround = Physics2D.OverlapCircle((Vector2)this.transform.position + positionWithOffset, raduis, ground);
        isLeftWall = Physics2D.OverlapCircle((Vector2)this.transform.position + leftOffset, raduis, ground);
        isRightWall = Physics2D.OverlapCircle((Vector2)this.transform.position + rightOffset, raduis, ground);
        Debug.Log("isGround: " + isGround);
        Debug.Log("isLeftWall: " + isLeftWall);
        Debug.Log("isRightWall: " + isRightWall);
    }

    private void OnDrawGizmosSelected() {
        Gizmos.DrawWireSphere((Vector2)this.transform.position + positionWithOffset, raduis);
        Gizmos.DrawWireSphere((Vector2)this.transform.position + leftOffset, raduis);
        Gizmos.DrawWireSphere((Vector2)this.transform.position + rightOffset, raduis);
    }

}

撞墙等待后转身的计时器

 //撞墙等待转身方法
 protected void WaitAndTurn()
     { 
 if(waitState)
         {
         waitClock -= Time.deltaTime;
         if(waitClock<= 0)
             {
             waitState=false;
             waitClock = waitTime; // 重置计时器
             this.transform.localScale = new Vector3(headFor.x,1,1);
         }       
     }
 
 }

撞墙以后原地等待同步动画的逻辑 

  //实时面朝向
  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();

 

标签:Vector2,transform,private,Unity,麦扣,void,怪物,牢弟,public
From: https://blog.csdn.net/2301_77947509/article/details/141279321

相关文章

  • 【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。很......
  • Unity Editor 保存图片、缩放纹理
    usingSystem.IO;usingUnityEditor;usingUnityEngine;publicclassConvertIconToMultipleSizes:Editor{[MenuItem("Assets/ConvertIconToMultipleSizes",true)]privatestaticboolValidateSplitFbxAnimation(){if(Selection.......
  • 【HarmonyOS Next】Unity(团结引擎)对接HarmonyOS
    一、环境UnityTuanjieV1.2.3DevEcoStudioNEXTDeveloperBeta1-BuildVersion:5.0.3.402二、官方资料参考Unity鸿蒙:https://docs.unity.cn/cn/tuanjiemanual/Manual/openharmony.htmlC#调用鸿蒙ArkTS:https://docs.unity.cn/cn/tuanjiemanual/Manual/openharmon......
  • Unity 通过序列化和反序列化的方式创建深度拷贝Clone方法注意事项
    要将类标记为可序列化在类定义前添加 [Serializable] 属性。[Serializable]publicclassWorkorderAddData{publicintid;publicResponseresponse;[Serializable]publicclassResponse{publicintid;[Serializable]......
  • Unity之UI穿透
    NGUI穿透NGUI出现穿透的时候,通过UICamera.hoveredobject进行判断是否是在UI上即可。问题方法UI穿透到了下方的非UI物体通过EventSystem.current.IsPointerOverGameObject(),if(!EventSystem.current.IsPointerOverGameObject())进行UI逻辑上一层UI穿透到下一层UI(常......
  • 乌尔章6500级超精细插画杰作:绝美女孩的惊艳细节,8K CGUnity壁纸,电影级光影下的羞涩笑容
    6500级乌尔章风格插画,绝美女孩细节惊人,高清CGUnity8K壁纸,光影电影级照明,棕色头发下的光滑肌肤与闪亮流苏上衣,白色高腰短裤,咖啡厅中羞涩微笑,湿润的快乐表情,浅蓝色眼睛,手放腿间,展现顶级品质的官方艺术作品。正向提示词ulzzang-6500,(original:1.2),(realistic:1.3)(m......
  • Unity编辑器批量设置图片格式
    在游戏开发中,经常需要批量设置图片的格式为Sprite类型,手动设置太麻烦,下面的编辑器脚本实现选中文件夹右键/Texture/SetAllImagesToSpriteType实现批量设置图片格式,具体格式参数可自行定义usingSystem;usingSystem.IO;usingUnityEngine;usingUnityEditor;///<summary>......
  • unity中, 二维平面上,求从点A出发,沿着方向B,与线段C的交点
    代码说明:点A:起始点。方向B:一个方向向量,表示从点A出发的方向。线段C:由两个点C1和C2定义。1usingUnityEngine;23publicclassLineIntersection:MonoBehaviour4{5//返回从点A出发,沿着方向B,与线段C的交点。如果没有交点,则返回null6publicstati......