【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】

这篇具有很好参考价值的文章主要介绍了【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unityUI专题篇
【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#


⭐⭐



🎶前言

【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#


🅰️


🎶(A)关键逻辑梳理


【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#


🎶(B)需求分析


【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#
【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#


🎶(C)行为实现——血条


【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#


😶‍🌫️:步骤实现

  • 1.坐标三个转化
  • 2.GUI的原点和屏幕的原点
  • 3.结构体的特点回顾——涉及Rect_结构体类型
  • 4.血条的显隐
  • 5.倒计时的两个方法
  • 6.近大远小血条的缩放——待

【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#
【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#

血条核心代码

 //GUI生命函数
    private void OnGUI()
    {
        if(showTime >=0) //血条倒计时展示
        {
            //简单的倒计时
            showTime -= Time.deltaTime;
            //世界坐标转屏幕坐标
            SreecPosition = Camera.main.WorldToScreenPoint(transform.position);

            //屏幕坐标转GUI坐标_____GUI的原点在左上角,屏幕坐标原点在左下角
            SreecPosition.y = Screen.height - SreecPosition.y;

            //底图Rect位置参数赋值
            GUIPosition1.x = SreecPosition.x - 50;
            GUIPosition1.y = SreecPosition.y - 70;
            GUIPosition1.width = 100;
            GUIPosition1.height = 15;

            //血条图Rect位置参数赋值
            GUIPosition2.x = SreecPosition.x - 50;
            GUIPosition2.y = SreecPosition.y - 70;

            //血条长度和血量同步
            GUIPosition2.width = 100*(nowBlood/maxBlood);
            GUIPosition2.height = 15;

            //绘制底图    
            GUI.DrawTexture(GUIPosition1, underTexture);
           
            //绘制血条       
            GUI.DrawTexture(GUIPosition2, topTexture);

        }
       
    }

更新敌方坦克

______-【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:      
//___________功能:敌方坦克逻辑封装
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class EnemyTank:TankFather 
{
    //随机移动点的位置数组
    public  Transform[] randomPosition;
    //目标位置
    private Transform target;
    //目标坦克
    public Transform Player;
    //检测范围
    public float distance = 10f;
    //子弹发射参数
    public AudioSource shootMusic;   //发射音效
    public GameObject shootball;     //发射的子弹类型
    public float shootSpeed = 1000f; //子弹的速度 
    public Transform[] shootTransform; //发射的组件信息
    public bool shootSwitch = false;  
    private float endTime = 3f;      //子弹发射间隔的时间
    //血条的参数
    public Texture underTexture;
    public Texture topTexture;
    private Vector3 SreecPosition;
    private Rect GUIPosition1;
    private Rect GUIPosition2;
    public float showTime = 0;

    private void Start()
    {
        //属性初始化赋值
        
        maxBlood = 500;
        nowBlood = 500;
        attack = 30;
        HeadSpeed = 50;
        //射击音效关闭
        shootMusic.enabled = false;
        moveSpeed = 10f;
        //先随机整一个目标点
        RandomPosition();

    }
    private void Update()
    {    
        transform.LookAt(target);

        //始终超自己的正方向移动
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);  //当距离差不多相等时,再随机目标点
        if(Vector3.Distance(transform .position ,target .position)< 0.5f)
        {
            RandomPosition();
        }
            
        //范围检测
        if (Vector3 .Distance(transform .position ,Player.position )<= distance && Player !=null )
        {
            //炮口瞄准玩家
            Head.transform.LookAt(Player);
            //倒计时发射子弹
            endTime = Mathf.MoveTowards(endTime, 0, 0.1f);
            if (endTime <= 0)
            {
                Fire();
                endTime = 3f;
            }        
        }
     
    }

    //随机指向一个移动点
    public void RandomPosition()
    {
        if (randomPosition.Length != 0)

            target = randomPosition[Random.Range(0, randomPosition.Length)];
    }
    //触发检测
    private void OnTriggerEnter(Collider other)
    {
       
        if (other.gameObject.tag == "bullet" )
        {
            //添加子弹挂载的目标坦克,方便获取该子弹的攻击力,与受伤逻辑相结合
            BulletMove ball = other.gameObject.GetComponent<BulletMove>();
            TankFather ballTank = ball.Tank.GetComponent<TankFather>();

            //当子弹不是自己打的到自己身上的时候
            if (ballTank.tag != gameObject.tag)
            {
                //扣血
                Heart(ballTank);
            }

        }
    }

    public override void Fire()
    {
        //开启射击音效
        shootMusic.enabled = true;
        shootMusic.Play();
        for (int i = 0; i < shootTransform.Length ; i++)
        {
            GameObject ball = Instantiate(shootball, shootTransform[i].position, shootTransform[i].rotation);
            BulletMove movScript = ball.GetComponent<BulletMove>();
            Rigidbody shootBall = ball.GetComponent<Rigidbody>();
            shootBall.AddForce(shootTransform[i].transform.forward * shootSpeed);
            movScript.Tank = gameObject;  //声明子弹是由谁打出去的
        }
     
    }
    
    //死亡行为重写
    public override void Death()
    {
        base.Death();
        GamePlane.SingleInstance.AddScore(10);
    }

    //受伤行为重写
    public override void Heart(TankFather other)
    {
        base.Heart(other);
        showTime = 3; //血条倒计时展示
    }

    //GUI生命函数
    private void OnGUI()
    {
        if(showTime >=0) //血条倒计时展示
        {
            //简单的倒计时
            showTime -= Time.deltaTime;
            //世界坐标转屏幕坐标
            SreecPosition = Camera.main.WorldToScreenPoint(transform.position);

            //屏幕坐标转GUI坐标_____GUI的原点在左上角,屏幕坐标原点在左下角
            SreecPosition.y = Screen.height - SreecPosition.y;

            //底图Rect位置参数赋值
            GUIPosition1.x = SreecPosition.x - 50;
            GUIPosition1.y = SreecPosition.y - 70;
            GUIPosition1.width = 100;
            GUIPosition1.height = 15;

            //血条图Rect位置参数赋值
            GUIPosition2.x = SreecPosition.x - 50;
            GUIPosition2.y = SreecPosition.y - 70;

            //血条长度和血量同步
            GUIPosition2.width = 100*(nowBlood/maxBlood);
            GUIPosition2.height = 15;

            //绘制底图    
            GUI.DrawTexture(GUIPosition1, underTexture);
           
            //绘制血条       
            GUI.DrawTexture(GUIPosition2, topTexture);

        }
       
    }
}

更新炮台

【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:      
//___________功能:敌方坦克逻辑封装
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class EnemyTank:TankFather 
{
    //随机移动点的位置数组
    public  Transform[] randomPosition;
    //目标位置
    private Transform target;
    //目标坦克
    public Transform Player;
    //检测范围
    public float distance = 10f;
    //子弹发射参数
    public AudioSource shootMusic;   //发射音效
    public GameObject shootball;     //发射的子弹类型
    public float shootSpeed = 1000f; //子弹的速度 
    public Transform[] shootTransform; //发射的组件信息
    public bool shootSwitch = false;  
    private float endTime = 3f;      //子弹发射间隔的时间
    //血条的参数
    public Texture underTexture;
    public Texture topTexture;
    private Vector3 SreecPosition;
    private Rect GUIPosition1;
    private Rect GUIPosition2;
    public float showTime = 0;

    private void Start()
    {
        //属性初始化赋值
        
        maxBlood = 500;
        nowBlood = 500;
        attack = 30;
        HeadSpeed = 50;
        //射击音效关闭
        shootMusic.enabled = false;
        moveSpeed = 10f;
        //先随机整一个目标点
        RandomPosition();

    }
    private void Update()
    {    
        transform.LookAt(target);

        //始终超自己的正方向移动
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);  //当距离差不多相等时,再随机目标点
        if(Vector3.Distance(transform .position ,target .position)< 0.5f)
        {
            RandomPosition();
        }
            
        //范围检测
        if (Vector3 .Distance(transform .position ,Player.position )<= distance && Player !=null )
        {
            //炮口瞄准玩家
            Head.transform.LookAt(Player);
            //倒计时发射子弹
            endTime = Mathf.MoveTowards(endTime, 0, 0.1f);
            if (endTime <= 0)
            {
                Fire();
                endTime = 3f;
            }        
        }
     
    }

    //随机指向一个移动点
    public void RandomPosition()
    {
        if (randomPosition.Length != 0)

            target = randomPosition[Random.Range(0, randomPosition.Length)];
    }
    //触发检测
    private void OnTriggerEnter(Collider other)
    {
       
        if (other.gameObject.tag == "bullet" )
        {
            //添加子弹挂载的目标坦克,方便获取该子弹的攻击力,与受伤逻辑相结合
            BulletMove ball = other.gameObject.GetComponent<BulletMove>();
            TankFather ballTank = ball.Tank.GetComponent<TankFather>();

            //当子弹不是自己打的到自己身上的时候
            if (ballTank.tag != gameObject.tag)
            {
                //扣血
                Heart(ballTank);
            }

        }
    }

    public override void Fire()
    {
        //开启射击音效
        shootMusic.enabled = true;
        shootMusic.Play();
        for (int i = 0; i < shootTransform.Length ; i++)
        {
            GameObject ball = Instantiate(shootball, shootTransform[i].position, shootTransform[i].rotation);
            BulletMove movScript = ball.GetComponent<BulletMove>();
            Rigidbody shootBall = ball.GetComponent<Rigidbody>();
            shootBall.AddForce(shootTransform[i].transform.forward * shootSpeed);
            movScript.Tank = gameObject;  //声明子弹是由谁打出去的
        }
     
    }
    
    //死亡行为重写
    public override void Death()
    {
        base.Death();
        GamePlane.SingleInstance.AddScore(10);
    }

    //受伤行为重写
    public override void Heart(TankFather other)
    {
        base.Heart(other);
        showTime = 3; //血条倒计时展示
    }

    //GUI生命函数
    private void OnGUI()
    {
        if(showTime >=0) //血条倒计时展示
        {
            //简单的倒计时
            showTime -= Time.deltaTime;
            //世界坐标转屏幕坐标
            SreecPosition = Camera.main.WorldToScreenPoint(transform.position);

            //屏幕坐标转GUI坐标_____GUI的原点在左上角,屏幕坐标原点在左下角
            SreecPosition.y = Screen.height - SreecPosition.y;

            //底图Rect位置参数赋值
            GUIPosition1.x = SreecPosition.x - 50;
            GUIPosition1.y = SreecPosition.y - 70;
            GUIPosition1.width = 100;
            GUIPosition1.height = 15;

            //血条图Rect位置参数赋值
            GUIPosition2.x = SreecPosition.x - 50;
            GUIPosition2.y = SreecPosition.y - 70;

            //血条长度和血量同步
            GUIPosition2.width = 100*(nowBlood/maxBlood);
            GUIPosition2.height = 15;

            //绘制底图    
            GUI.DrawTexture(GUIPosition1, underTexture);
           
            //绘制血条       
            GUI.DrawTexture(GUIPosition2, topTexture);

        }
       
    }
}


🎶(D)场景搭建——敌方阵营


【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#


🎶(E)场景搭建——通关面板


_____________【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#

【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#
😶‍🌫️:步骤实现:

  • 1.面板制作
  • 2.数据显示和存储
  • 3.循环开始

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//-------------------------------------
//—————————————————————————————————————
//___________项目:      
//___________功能:通关面板逻辑相关
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class VictorPlane : BeginFather<VictorPlane>
{
    public Button Require;  //确认按钮
    public InputFram name;  //输入的昵称
    public Label Score;     //显示的分数
    public Label LTime;      //显示的时间
    private int time;

 
    private void Start()
    {
        //添加按钮事件
        Require.triggerEvent += () => {

            //点击按钮后跳到主场景
            SceneManager.LoadScene("BeginScreen");
            //将数据存储
            SaveGameData.DataContorl.SaveRankData(name.ContorlContent.text, Convert.ToInt32(Score.ContorlContent.text), time);
        };
        //默认隐藏
        Hidden();
    }
    private void Update()
    {
        //将光标显示出来
        Cursor.visible = true;
        //分数显示
        Score.ContorlContent.text = GamePlane.SingleInstance.laScore.ContorlContent.text;
        //时间显示
        LTime.ContorlContent.text = GamePlane.SingleInstance.laTime.ContorlContent.text;
        //时间
        time = GamePlane.SingleInstance.time;
    }

}


🎶(F)行为实现——通关点触发


【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:      
//___________功能:  通关触发
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class over : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if(other.CompareTag ("Player") )
        {
            Time.timeScale = 0;
           VictorPlane.SingleInstance.Show();
            
        }
    }
}

🎶(G)场景搭建——结束面板


【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】,# UnityGUI篇,# unity游戏demo制作,unity,游戏,游戏引擎,IMGUI,c#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 死亡显示面板
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class DiedPlane : BeginFather<DiedPlane >
{
    public Button back;
    private void Start()
    {
        back.triggerEvent += () =>
        {
            //点击按钮后跳到主场景
            SceneManager.LoadScene("BeginScreen");
        };
        Hidden();       
    }
}


相关文章


⭐【2023unity游戏制作-mango的冒险】-6.关卡设计

⭐【2023unity游戏制作-mango的冒险】-5.攻击系统的简单实现

⭐【2023unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随

⭐【2023unity游戏制作-mango的冒险】-3.基础动作和动画API实现

⭐【2023unity游戏制作-mango的冒险】-2.始画面API制作

⭐【2023unity游戏制作-mango的冒险】-1.场景搭建

⭐“狂飙”游戏制作—游戏分类图鉴(网易游学)

⭐本站最全-unity常用API大全(万字详解),不信你不收藏



你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!文章来源地址https://www.toymoban.com/news/detail-678166.html

到了这里,关于【Unity3D游戏魔坦之争】游戏结束流程封装实现【七】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • UNITY3D回合制游戏开发教程案例

    UNITY3D实现回合制游戏 ,类似梦幻西游,口袋妖怪,阴阳师。 先上效果 UNITY3D 回合制游戏案例源码开发教程 普通攻击 AOE技能 游戏概述 回合制游戏是一种策略游戏,玩家需要在自己的回合内进行决策,然后等待对手的回合。游戏通常包括角色扮演、卡牌、战略等元素,玩家需

    2024年02月09日
    浏览(47)
  • Unity读书系列《Unity3D游戏开发》——基础知识

    本篇对应标题书籍的第一章基础知识,也就是unity的基本常识和工作流的说明。 Unity目前用于创建2D和3D游戏、模拟应用程序、可视化体验以及其他虚拟现实(VR)和增强现实(AR)应用,游戏工业两开花。 Unity初版是在2005年发布的,开始时用unity3.X、4.X这样的名称进行版本更新

    2024年01月18日
    浏览(47)
  • 以unity3d为例解读:游戏数据加密

    目录 前言 1、Virbox 一、Virbox 是怎么做的? 1、如何对程序进行保护? 2、如何对资源进行保护? 3、使用加密工具前后比较 二、Virbox 保护方案特点 l 更安全 l 更全面 l 更简单 2、DES和RSA加密算法 一、DES加密算法 二、RSA加密算法 RSA加密算法的基本流程如下: 网络游戏数据文

    2024年02月02日
    浏览(50)
  • 使用Unity3D制作2D游戏的重点做法

    官网上有提供一个 2D游戏的教学范例 ,这个游戏只不过把镜头摆放在横向位置跟随角色移动,游戏内物件运动时固定一个轴不动,使他像横轴式的2D游戏来玩,本质上其实还是个3D游戏,所以如果没有3D建模的话不就没办法做2D游戏了?其实这些并没有定论,就看制作者如何运

    2024年02月11日
    浏览(37)
  • 【Unity3D】如何用使用Unity实现退出游戏的功能

    1、使用Unity编译器时: 2、打包后: 很多时候,我们都知道Application.Quit()代码,但是我们在Unity编译器调试的时候发现即使挂上了这个代码的组件或物体都无法退出编译,因为该代码只在打包后可以实现退出功能。 所以我们可以把两个实现代码同时写入脚本,这样既可以在编

    2024年02月11日
    浏览(46)
  • Unity3D PVP游戏位置同步算法优化详解

    在Unity3D中,PVP(Player versus Player)游戏的位置同步是一项重要的技术,它决定了游戏中玩家之间的互动体验。本文将详细介绍Unity3D PVP游戏位置同步算法的优化方法,并给出相应的技术详解和代码实现。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础

    2024年01月16日
    浏览(36)
  • Unity3D项目之游戏场景小地图制作

    创建一个场景资源,可在asset store资源商店下载,选择心仪场景。 链接:https://assetstore.unity.com/?locale=zh-CN 添加一个对象GameObject,命名为player,子物体包括:主摄像机,角色,后面步骤会添加一个plane。 添加一个地图摄像机,命名为MapCamera。修改属性projection为OrthoGraphic;Size为

    2024年02月11日
    浏览(42)
  • Unity读书系列《Unity3D游戏开发》——编辑器的结构

    本篇对应标题书籍的第二章编辑器的结构,也就是unity的编辑器的使用及菜单的使用。 当我们制作的软件或游戏需要多人合作时,就会使用git、svn进行版本管理。一般来说只保留Assets、ProjectSettings、Packages这几个文件夹,git会自动生成.git文件,我们添加需要屏蔽的文件夹或后

    2024年01月25日
    浏览(52)
  • Unity3D 游戏服务器怎么实现热更新详解

    Unity3D是一款强大的游戏开发引擎,它不仅可以用于游戏客户端的开发,还可以用于游戏服务器的搭建。在游戏开发过程中,热更新是一项非常重要的功能,它可以使游戏在不重新启动的情况下,更新游戏内容,修复bug,提高游戏体验。本文将详细介绍Unity3D游戏服务器如何实

    2024年01月16日
    浏览(37)
  • 【unity3D】unity记忆翻牌小游戏教程(简单详细)

    游戏开发的 学习记录 ⑨ (最近在做得游戏里想加一个类似于记忆翻牌小游戏得部分,然后在网上收集了资料学习了一下,学会后写下这份制作记录,希望可以帮到你~) 📜一位大佬的博客,写的很详细:【Unity3D游戏教程】记忆翻牌游戏 (大家可以先看大佬这篇,我写这篇

    2024年02月07日
    浏览(199)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包