基于unity的google小恐龙游戏5----第四个BOSS

这篇具有很好参考价值的文章主要介绍了基于unity的google小恐龙游戏5----第四个BOSS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

上一篇文章我实现了第三个BOSS,蜂后,这个boss实际上跟眼珠子没有什么大区别,不过还是有一些需要斟酌写好的,无论是什么,就算他再简单也好,也总是有他的意义。我觉得搞这样的练习最重要还是体会过程,积累一些经验。最后总会有收获的。本来我是想写一些新的东西的,但是最后发现自己技术实在是有限,所以还是继续搞一下基础的,逐层递进。慢慢来。好了,开始本次练习记录。

Boss

一般来说,设计Boss肯定是要多设计几个小怪的,但是这次我直接设计这个boss,不设计太多小怪,这次选择的boss是来自泰拉瑞亚的克脑,这个boss的有趣的点就是他会让玩家陷入一个叫做“混乱”的异常状态。让玩家的方向键相反。这个似乎可以通过unity的刚体速度改变实现。先回顾一下我这个小恐龙的移动逻辑。

private Vector3[] direction = new Vector3[]{
        Vector3.right,Vector3.up,Vector3.left,Vector3.down
        };
    private KeyCode[] keys = new KeyCode[] {
        KeyCode.D,KeyCode.W,KeyCode.A,KeyCode.S
    };

上面这两段代码是我这个小恐龙移动的最基本的逻辑,通过两个数组,一个存放KeyCode,一个存放记录速度,那么只要设置一个for循环不断检查哪个按键按了,然后利用一个dirHeld变量,使得小恐龙直接获得一个对应的速度变量。

想法一:

 在Boss里面的脚本实现这个功能,由于unity里面对于输入流的检测是共通的,因此,我的第一个设想,是直接在Boss的脚本里面,检测输入,然后使其获得相反的速度。那样就可以得到一个混乱的效果。

Input.GetKey(KeyCode.A)------>dinoRig.velocity = Vector3.right;

想要以这样的方法实现,然后通过unity面板里面的脚本顺序设定其执行顺序,可能可以实现这样的效果。

但是最后以失败告终,无论怎么调节都好,都没有任何效果。最后发现这样的核心逻辑是错误的,因为unity对象的脚本并行执行的时候,无论如何都会是的dino的dirheld回到正确的按键,假设是Boss先,那么按键检测到,更改了速度,下一个恐龙脚本执行就会变回原来的速度,要是恐龙的脚本先执行,在后面Boss的脚本又跟改了速度,紧接着还是恐龙的脚本,而且在恐龙的脚本里面,每一次开始我都会把dirHeld重置为-1。

最后这个想法以失败告终

想法二:

现在是第二个想法,在恐龙的脚本里面添加一个isPlz的变量,检测是否处于混乱状态,如果是的话,那就检测dirheld,将对应的编号调转。那么就需要在Boss的脚本里面。将dino脚本实例化,这个耶不困难,因为,基本每一个Boss都保留则恐龙的实例化对象,只需要执行GetComponent这个泛化函数就可以了。

一开始的设想就是用if来执行,但是忽略了,if是顺序执行的,那么判断完前面后面那个依然会再次判断。

if(dirHeld==0){dirHeld=2;}

if(dirHeld==2){dirHeld=0;}

这就出现了无论如何都只会让dirHeld为0,不过可以直接通过goto?但是书上说goto不能乱用。

所以应该使用switch,而且switch的执行是 比较迅速的。代码修改为:

    switch(dirHeld)//改用switch
    {
            case 0:
            dirHeld = 2;
            break;
            case 2:
            dirHeld = 0;
            break;
            default:
            break;
    }
}

就这样,混乱效果就可以顺利执行了。

然后为了让玩家知道自己混乱了,就随便画了个?的图标,以及Boss释放混乱的信号:

使用的贴图图如下:

google小恐龙boss,unity小恐龙,游戏,c#,unitygoogle小恐龙boss,unity小恐龙,游戏,c#,unitygoogle小恐龙boss,unity小恐龙,游戏,c#,unitygoogle小恐龙boss,unity小恐龙,游戏,c#,unity

新小怪:飞眼

这个小怪本来在游戏里就是Boss的小弟,我也顺理成章地把他加进去,在游戏里,他会一直绕着Boss转,冲向玩家。但是冲向玩家地怪太多了。所以我模仿书里地实例,让他以左右飘动地形式从上往下移动,会配合Boss地混乱攻击。

这玩意实现比较简单直接上代码:

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

public class flyEyes : MonoBehaviour
{
    [Header("Set in Inspector")]
    private Rigidbody rig;
    public int facing;
    public float timePast;
    public float timeNow;
    // Start is called before the first frame update
    void Start()
    {
        rig = GetComponent<Rigidbody>();
        rig.velocity = Vector3.down;
        facing = 1;
        timeNow = Time.time;
        timePast = 1f;
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 Pos = gameObject.transform.position;
        if (Pos.y <= 1f)
        {
            Destroy(gameObject);
        }
        if(Time.time - timeNow >= timePast)
        {
            timeNow = Time.time;
            rig.velocity = new Vector3(facing * 2f, -1, 0);
            if(facing == 1)
            {
                facing = -1;
            }
            else
            {
                facing = 1;
            }
        }

    }
}
 

 这是使用的贴图:google小恐龙boss,unity小恐龙,游戏,c#,unity

 Boss实现

这个boss不需要跟往常一样,盯着玩家或者转向。因为他本来就是对称的。

移动逻辑:在四个方向瞬移,并且不断向玩家靠近,靠近玩家到一定程度就会瞬移到别的地方。朝玩家靠近是为了阻挠玩家躲避,不是为了攻击。

攻击三个:分别是召唤五个小弟从天上飘下来

让玩家陷入混乱状态,并召唤三个小弟

跟三个分身夹击玩家。

实现都比较简单,而且这次我直接使用函数了,不像之前那样全部堆在update里面。

下面是代码:

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

public class KBrain : MonoBehaviour
{
    [Header("Set in Inspector")]
    public GameObject dino;
    public Vector3 dinoPos;//恐龙坐标恐龙位置
    public float timeNow;
    public float timeSum;
    public float timeLive;
    public float timePast;
    public GameObject brainShadow;//这个是对象
    public GameObject what;
    public GameObject flyEyes;//飞眼小弟
    public GameObject wavePre;//波
    public Vector3 standNext;
    public int roll;//技能选择
    public bool canMove;//是否可以到处移动
    public Rigidbody rig;//记录刚体
    private Vector2[] sumplace = new Vector2[] {
        new Vector3(5,5),new Vector3(5,-5),new Vector3(-5,5),new Vector3(-5,-5)
    };//需要使用到这个
    private Vector3[] transPlace = new Vector3[]
    {
        new Vector3(32.5f,8.4f,0),new Vector3(17.2f,8f,0),new Vector3(17.2f,2f,0),new Vector3(32.5f,2f,0)
    };//每过一次就瞬移到这个位置
    public Vector3 vel;
    private bool isRush;
    private bool isTrack;
    public Rigidbody dinoRig;
    public int sumNum;//记录影子的站位对应的数组
    public Vector3 sum;
    public int tranNum;
    public Vector3 flyPos;
    public bool isPlz;
    public bool hasPlz;
    public float plzzTime;
    private Vector3 Pos;
    public Dino dinoM;
    public int test;

    // Start is called before the first frame update
    void Start()
    {
        dino = GameObject.Find("dino");
        dinoPos = dino.transform.position;
        sum = new Vector3(32.5f, 8.4f, 0);
        gameObject.transform.position = sum;//一开始生成位置
        timeNow = Time.time;//获取初始时间
        timeSum = Time.time;
        timeLive = 60f;
        timePast = 3f;
        standNext = dinoPos;//这次的逻辑为一直向玩家靠近,到时间再换点
        vel = Vector3.zero;
        isRush = false;
        isTrack = false;
        rig = GetComponent<Rigidbody>();
        dinoRig = dino.GetComponent<Rigidbody>();
        canMove = true;
        tranNum = 0;
        flyPos = new Vector3(20f,9.5f,0);
        isPlz = false;
        hasPlz = false;
        plzzTime = 0;
        Pos = gameObject.transform.position;
        dinoM = dino.GetComponent<Dino>();
    }

    // Update is called once per frame
    void Update()
    {
        if(Time.time - timeSum >= timeLive)
        {
            GameObject wav = GameObject.Find("wave1(Clone)");
            if (wav != null)
            {
                Destroy(wav);
            }
            GameObject wat = GameObject.Find("what(Clone)");
            if (wat != null)
            {
                Destroy(wat);
            }
            dinoM.isPlz = false;
            Destroy(gameObject);
        }
        dinoPos = dino.transform.position;
        if (canMove == true)
        {
            Move();
        }
        if(Time.time - timeNow >= timePast)//这个是表示开始释放技能
        {
            Skill();
        }

    }
    void transNumPlus()
    {
        if(tranNum == 3)
        {
            tranNum = 0;
        }
        else
        {
            tranNum++;
        }
    }
    void Move()
    {
        dinoPos = dino.transform.position;
        standNext = dinoPos;//获得下一个目标
        Pos = gameObject.transform.position;
        if ((gameObject.transform.position - standNext).magnitude <= 2f||Pos.x>=33f||Pos.x<=16f)
        {//到达了目的地
            rig.velocity = Vector3.zero;
            gameObject.transform.position = standNext;//停止移动
            transNumPlus();
            gameObject.transform.position = transPlace[tranNum];

        }
        else
        {
            vel = standNext - gameObject.transform.position;
            vel.Normalize();
            rig.velocity = vel * 2f;
        }
    }
    void Skill()
    {
        canMove = false;
        switch(roll)//根据这个变量选择技能
        {
                case 0:
                for(int i = 0; i < 5; i++)
                {
                    GameObject flye = Instantiate(flyEyes);//生成flyeyes
                    Vector3 tem = flyPos;
                    tem.x += 2 * i;
                    tem.y += 0.5f * i;
                    flye.transform.position = tem;                   
                }
                canMove = true;
                timeNow = Time.time;//重置时间
                roll = Random.Range(0, 3);//一共三个技能
                break;
                case 1:
                if (isTrack == false)
                {
                    dinoPos = dino.transform.position;
                    standNext = dinoPos;standNext.y += 2f;
                    vel = standNext - gameObject.transform.position;
                    vel.Normalize();
                    rig.velocity = vel*5f;
                    isTrack = true;
                }
                if (isTrack == true)
                {
                    if((gameObject.transform.position - standNext).magnitude <= 0.1f)//到达目的位置
                    {
                        rig.velocity = Vector3.zero;
                        gameObject.transform.position = standNext;//固定位置
                        isPlz = true;
                    }
                    if (isPlz == true)
                    {
                        if (hasPlz == false)
                        {
                            GameObject plzWave = Instantiate(wavePre);//生成
                            Vector3 plztem = gameObject.transform.position;
                            for(int i = 0; i < 3; i++)
                            {
                                GameObject flp = Instantiate(flyEyes);
                                Vector3 tem = flyPos;
                                tem.x += 3 * i;
                                flp.transform.position = tem;
                            }
                            plztem.y += 1.5f;//使得对象显示在上面,目前不是很清楚图层咋用
                            plzWave.transform.position = plztem;
                            Instantiate(what);
                            plzzTime = Time.time;//获取时间
                            hasPlz= true;
                        }
                        GameObject wt = GameObject.Find("what(Clone)");
                        if (wt != null)//同步混乱符号
                        {
                            Vector3 tem2 = dino.transform.position;
                            tem2.x -= 0.12f;
                            tem2.y += 0.7f;
                            wt.transform.position = tem2;
                        }
                        dinoM.isPlz = true;//反转的方法修改为此
                        if(Time.time - plzzTime >= 5f)//时间到了
                        {//以下为重置改变过的的变量
                            Destroy(wt);
                            GameObject wave = GameObject.Find("wave1(Clone)");
                            if(wave != null)
                            {
                                Destroy(wave);
                            }
                            hasPlz = false;
                            isPlz = false;
                            isTrack = false;
                            timeNow = Time.time;
                            canMove = true;
                            dinoM.isPlz = false;
                            roll = Random.Range(0, 3);
                        }
                    }

                }
                break;
                case 2:
                if (isTrack == false) {

                    dinoPos = dino.transform.position;//获得恐龙坐标
                    Vector3 pppos = dinoPos;
                    pppos.x += sumplace[0].x; pppos.y += sumplace[0].y;
                    gameObject.transform.position = pppos;
                    vel = dinoPos - pppos;
                    vel.Normalize();
                    rig.velocity = vel * 5f;
                    isTrack = true;
                }
                if (isRush == false)
                {
                    for (int i = 1; i < 4; i++)
                    {
                        GameObject sdw = Instantiate(brainShadow);
                        Vector3 sp = dinoPos;
                        sp.x += sumplace[i].x; sp.y += sumplace[i].y;
                        sdw.transform.position = sp;
                        Rigidbody sr = sdw.GetComponent<Rigidbody>();
                        Vector3 sv = dinoPos - sp;
                        sv.Normalize();
                        sr.velocity = sv * 5f;
                    };
                    isRush = true;
                }
                Vector3 POS = gameObject.transform.position;
                if (POS.x <= 16f || POS.y <= 1f)
                {
                    isRush = false;
                    isTrack = false;
                    timeNow = Time.time;
                    canMove = true;
                    roll = Random.Range(0, 3);
                }
                break;
                
        }
    }
}
 

 这是使用的贴图:google小恐龙boss,unity小恐龙,游戏,c#,unitygoogle小恐龙boss,unity小恐龙,游戏,c#,unitygoogle小恐龙boss,unity小恐龙,游戏,c#,unity

 下面是效果图,还是不会传视频,是不是一定要把视频传上b站或者优酷才可以放在这里面啊,不是很懂。

google小恐龙boss,unity小恐龙,游戏,c#,unitygoogle小恐龙boss,unity小恐龙,游戏,c#,unity

test

 

上面是个视频,还没有加碰撞,所以是无敌的,虽然感觉效果不怎么样,但是作为练习,也让我有所收获了。我还会继续添加东西,但是快过年了,可能会休息一段时间,在这里拜个早年!祝大家新年快乐!万事如意 !谢谢大家的支持!文章来源地址https://www.toymoban.com/news/detail-827785.html

到了这里,关于基于unity的google小恐龙游戏5----第四个BOSS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python小游戏毕设 仿谷歌浏览器小恐龙小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 仿谷歌浏览器小恐龙小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项

    2024年02月02日
    浏览(91)
  • 【开源&ESP32谷歌恐龙小游戏】【游戏演示和介绍】LVGL ST7789 适用于Arduino

      【源码及教程地址 - 持续更新】 ESP32 C3 LVGL 迷你小电视 Google谷歌恐龙小游戏 1.9寸LCD显示屏开发板 ST7789 适用于Arduino开发板,教程,资料,程序,代码,PDF手册 【开源 ESP32谷歌恐龙小游戏】【游戏演示和介绍】LVGL ST7789 适用于Arduin

    2024年02月10日
    浏览(44)
  • python毕设分享 仿谷歌浏览器小恐龙小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 仿谷歌浏览器小恐龙小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项

    2024年02月03日
    浏览(41)
  • 我们来用Unity做个2D像素boss战

    从个人角度出发,《死亡细胞》有很多让我爱不释手的特征:优秀的操作手感,碎片化的剧情,变化多端的随机地图,多种特点明显的敌人,丰富的装备(技能)系统——以及精彩炫酷的Boss战。无论是守护者居所的大型Boss巨人,还是时钟室的小型Boss时间刺客,在和他们战斗

    2023年04月22日
    浏览(35)
  • 破茧而出,边缘计算继云计算后成为计算的第四个浪潮

    《中智观察》第 1607 篇推送 作者:赵满满 编辑:小瑞瑞 头图来源:摄图网 对于自动驾驶汽车,必须做出闪电般快速、100%准确的决策。如果一个孩子跑过马路,汽车在刹车之前不能冒哪怕是最轻微的延误风险。 然而云计算却是连接到集中式数据中心,在遥远的数据中心处理

    2023年04月10日
    浏览(35)
  • Unity基于Google Protobuf序列化和反序列化小案例

    1.协议定义,简单实现传玩家的2D坐标    2.在Unity的Assets目录下创建一个Plugins文件夹(必须这样命名),此文件专门存放扩展文件, 再新建文件夹BaseInfolibrary,将Google.Protobuf.dll拖入  3.新建一个Test.cs脚本  脚本中引入命名空间 代码改进:通用序列化模板(只用来序列化Message)

    2024年02月15日
    浏览(35)
  • JavaEE学习的第三部分(重点在第四个知识点,SSM框架整合)

    Spring MVC的拦截器(Interceptor) 类似于Java Servlet的过滤器(Filter)。前面学习Java Web学过一点过滤器。 拦截器的作用 是拦截用户的请求,并做相应的处理 。例如在JSP提交表单数据给Controller,先是提交给拦截器的类。比如权限验证,是否登录,然后再交给Controller处理。 作法:需

    2024年02月12日
    浏览(34)
  • Unity常用2D子弹弹幕以及枪械类型的实现:可实现霰弹枪,Boss弹幕,子弹反弹,追踪弹等

    Hello大家好我是开罗小8,今天我来给大家带来Unity常用子弹弹幕类型的实现,功能的实现方式有很多种,在实现效果中,我会尽可能用简单的代码实现, 文章的示例项目文件在文章底部 环形弹幕实现 追踪弹 本文 子弹始终朝向其前进方向移动 (在2D中红轴为前进方向,3D中蓝

    2024年02月05日
    浏览(54)
  • 【简单3d网络游戏制作】——基于Unity

    目录 Demo展示 前期知识点准备 1.delegate委托 2.通信协议 3.List容器 4.dictionary容器 5.MethodInfo类 进入创作 c/s通用通信协议: 客户端  1.场景搭建 2.BaseHuman刨析(Sync+Ctrl)         Ctrl脚本         Sync完整代码          BaseHuman完整代码 3.NetManager刨析 4.Main刨析       

    2024年02月05日
    浏览(56)
  • 基于unity的《危机rpg》游戏开发

    文章目录 概要 整体架构流程 技术名词解释 技术细节 小结 给玩家提供PC端和移动端的操作、闲适的音效、完整的闭环和玩法。必须实现三大主场景制作、大地图制作、导表技术引入、移动端摇杆控制、本地存档、音效同步、极强的交互以及游戏闭环。玩家通过输入设备给予

    2024年03月16日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包