【unity之IMGUI实践】游戏玩法逻辑实现【四】

news2024/7/6 5:32:01

在这里插入图片描述


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

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

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unityUI专题篇
在这里插入图片描述


抽象父类继承实现

在这里插入图片描述


文章目录

    • 抽象父类继承实现
    • 🎶前言
    • 🎶(==A==)常用关键API
    • 🎶(==B==)需求分析
    • 🎶(==C==)行为实现——小地图和相机跟随
    • 🎶(==D==)行为实现——捡起武器发射炮弹
    • 🎶(==E==)行为实现——炮弹的销毁和特效
      • 总结:
    • 问题:往前走时,发射方向和炮口方向相反


🎶前言

在这里插入图片描述


🅰️


🎶(A常用关键API


在这里插入图片描述
在这里插入图片描述


🎶(B需求分析


在这里插入图片描述


🎶(C行为实现——小地图和相机跟随


在这里插入图片描述


  • Target Texture 行为渲染

——————————————在这里插入图片描述
___________________________在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:     
//___________功能:     地图相机跟随
//___________创建者:_______秩沅_______
//_____________________________________
//-------------------------------------
public class cameraFollow : MonoBehaviour
{
    public Transform  Tank;
    private Vector3 offset;
    public float heiht;
    private float OffX;
    private float offZ;

    private void Start()
    {
        heiht = transform.position.y; 
    
    }
    private void LateUpdate()    //注意点1:相机相关逻辑存放点
    {
        if (Tank == null) return; //注意点2:为空判断

        //只有相机的Z轴和X轴跟着Tank变化,y则是距离地面的高度
        offset.x  = Tank.position.x;
        offset.z  = Tank.position.z;
        offset.y = heiht;
        gameObject.transform.position = offset;

       
    }
}


🎶(D行为实现——捡起武器发射炮弹


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

😶‍🌫️ 步骤


1.靠近武器,碰撞检测
2.将武器位置于坦克发射位置重合
3.武器中封装了发射方法
4.发射方法中封装了炮弹实例化并且发射的逻辑

坦克基类的封装

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       
//___________功能: 坦克基类——集中子类相同点
//___________创建者:______秩沅______
//___________________________________
//-------------------------------------
public abstract  class TankFather : MonoBehaviour
{
    //攻击和防御相关
    public int attack;
    public int defence; 
    public int nowBlood;
    public int maxBlood;
    //移动和转速相关
    public int moveSpeed;
    public int RotateSpeed;
    public int HeadSpeed;
    public Transform  Head;
    //击败特效
    public GameObject diedEffect;
  

    //受伤行为
    public virtual  void Heart(TankFather other)
    {
        //当攻击力大于防御力时才生效
        if (other.attack - defence > 0)
        {
            nowBlood -= (other.attack - defence);
        }
        if(nowBlood <= 0 )
        {
            nowBlood = 0;
            Death();
        }
       //更新血条
        GamePlane.SingleInstance.UpdataBlood(maxBlood ,nowBlood );
    }

    //死亡行为
    public virtual  void Death()
    {
        Destroy(this);
        //将特效实例化相关逻辑
        GameObject effect = Instantiate(diedEffect, this.transform.position ,this.transform.rotation);
        AudioSource soudClip = GetComponent<AudioSource>();
        soudClip.enabled  = MusicContol.SingleMusicContol.nowMusicData.soundSwitch;
        soudClip.volume = MusicContol.SingleMusicContol.nowMusicData.soundRoll ;
        soudClip.mute = false;
        soudClip.playOnAwake = true;
    }

    //开火行为
    public abstract void Fire();  //子类中每一个的开火方式都不同,作为抽象方法
    
   
}


主坦克的运动逻辑的封装

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       
//___________功能:  坦克的移动和旋转
//___________创建者:_______秩沅_______
//_____________________________________
//-------------------------------------
public class TankSport : TankFather
{
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       
//___________功能:  坦克的移动和旋转
//___________创建者:_______秩沅_______
//_____________________________________
//-------------------------------------
public class MainTank : TankFather
{
    //主坦克专有特征
    public  Weapon nowWeapon;
    private Vector3 zero = new Vector3(0,0,0);
  

    //特征属性初始化
    private void Awake()
    {
        Head = transform.GetChild(1).GetChild(0);
        maxBlood = 100;
        nowBlood = 100;
        attack = 30;
        defence = 10;
        moveSpeed = 5;
        RotateSpeed = 50;
        HeadSpeed = 500;
    }

    private void Update()
    {
        //坦克的移动 = 大小*方向
        transform.Translate(Input.GetAxis("Vertical") *Vector3.forward*moveSpeed *Time.deltaTime );
        //坦克的旋转 = 大小*轴向
        transform.Rotate(Input.GetAxis("Horizontal") *Vector3.up *RotateSpeed *Time .deltaTime );
        //头部炮管的旋转 = 大小*轴向
        Head.Rotate(Input.GetAxis ("Mouse X") *Vector3.up*HeadSpeed*Time .deltaTime );
        //左键发射炮弹
        if(Input.GetMouseButtonDown(0))
        {
            Fire();

        }
    }

   

    //捡武器行为
    public void ChangeWeapon(GameObject weapon)
    {
        
        nowWeapon = weapon.GetComponent<Weapon>();
        //依附成为子对象______待优化
        weapon.gameObject.transform.position = Head.GetChild(0).transform.position ;
        weapon.gameObject.transform.rotation = Head.GetChild(0).transform.rotation;
        weapon.gameObject.transform.SetParent(Head.GetChild(0));
        attack += nowWeapon.attack;
     
    }

    //开火行为重写
    public override void Fire() 
    {
        nowWeapon.Shoot(); 
    }

   
  
}


武器类的封装

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能:  武器的逻辑相关控制
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class Weapon :MonoBehaviour 
{
    public GameObject Tank;             //挂载的坦克对象
    public GameObject bullet;           //子弹对象
    public Transform []  bulletNum;     //子弹数量及位置
    public int attack;                  //攻击力    
    public float bulletSpeed = 1000f;   //速度
    private  AudioSource shootSound;    //发射音效

    private void Start()
    {
        //加载发射音效
        
        shootSound = GetComponent<AudioSource>();
        
        //同步设置中音效大小

        shootSound.enabled = MusicContol.SingleMusicContol.nowMusicData.soundSwitch;
        shootSound.volume = MusicContol.SingleMusicContol.nowMusicData.soundRoll;
        shootSound.enabled = false;

        //加载子弹发射数量
        bulletNum = new Transform[transform.GetChild(0).childCount];

        for (int i = 0; i < transform.GetChild (0) .childCount ; i++)
        {
            bulletNum[i] = transform.GetChild(0).GetChild(i);
        }
    }

    //销毁行为
    public void Vanish()
    {
        Destroy(this.gameObject );
    }

    //射击行为
    public virtual void Shoot()
    {
        shootSound.enabled = true;
        shootSound.Play();

        //实例化炮弹,并进行发射
        for (int i = 0; i < bulletNum.Length ; i++)
        {
            GameObject ball = Instantiate(bullet, bulletNum[i].position, bulletNum[i].rotation );
            BulletMove movScript = ball.GetComponent<BulletMove>();          
            Rigidbody shootBall = ball.GetComponent<Rigidbody>();

            shootBall.AddForce(transform.forward * bulletSpeed);

            movScript.Tank = Tank;  //声明子弹是由谁打出去的
        }     
    }

    //如果碰到标签是主坦克玩家 并且 武器没有主人
    private void OnCollisionEnter(Collision collision)
    {
        
        if (Tank == null && collision.transform.name  == "Player")
        {
            Tank = collision.gameObject;
            MainTank player = collision.gameObject.GetComponent<MainTank>();           
            player.ChangeWeapon(this.gameObject);           
            print("玩家");
        }
    }

}



🎶(E行为实现——炮弹的销毁和特效


在这里插入图片描述

——————————在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能:  子弹的逻辑相关
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class BulletMove : MonoBehaviour
{
    public  GameObject Tank;          //挂载在哪个坦克上
    public  GameObject DeidEffect;
    public  AudioSource distorySound; //销毁的音效
    private float endTime = 15f; //销毁倒计时

    private void Start()
    {
       
    }
    //子弹的销毁及特效
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Environment"))
        {
            if (DeidEffect != null)
            {
                GameObject eff =  Instantiate(DeidEffect, transform.position, transform.rotation);
                //音效控制
                distorySound = eff.GetComponent<AudioSource>();
                distorySound.enabled = MusicContol.SingleMusicContol.nowMusicData.soundSwitch;
                distorySound.volume = MusicContol.SingleMusicContol.nowMusicData.soundRoll;
                eff.AddComponent<SelfDestroy>();
            }
            Destroy(this.gameObject);          
        }    
    }
    
    private void Update()
    {
        //当未碰撞时自动销毁
        endTimeDistory(gameObject);
        
    }

    //倒计时销毁
    public void endTimeDistory( GameObject instans)
    {
        endTime = Mathf.MoveTowards(endTime, 0, 0.1f);
        if (endTime <= 0) Destroy(instans);
    }
}


总结:

问题: 为什么炮弹生成了却无法射出 ; 原因: FreezePosition被锁定了

问题:往前走时,发射方向和炮口方向相反

相关文章


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

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

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

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

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

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

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

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



你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/768419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.11 Bootstrap 徽章(Badges)

文章目录 Bootstrap 徽章&#xff08;Badges&#xff09;激活导航状态 Bootstrap 徽章&#xff08;Badges&#xff09; 下面将讲解 Bootstrap 徽章&#xff08;Badges&#xff09;。徽章与标签相似&#xff0c;主要的区别在于徽章的边角更加圆滑。 徽章&#xff08;Badges&…

短视频seo抖音矩阵号系统源码开发搭建分享

我们自主研发的短视频矩阵系统源码&#xff0c;技术研发的独立核心算法的视频内容管理和展示功能。无需额外的流量接口费用和复杂的配置&#xff0c;轻松地创建和管理短视频内容&#xff0c;短视频矩阵源码是指将抖音平台上的视频资源进行筛选、排序等操作&#xff0c;进而提升…

【ROS】ROS1人机界面开发:在QtCreator中创建ROS1功能包

【ROS】郭老二博文之:ROS目录 1、版本要求 ROS的QtCreator插件要和QtCreator版本对应一致,否则报错。 本人QtCreator版本为:10.0.1,需要下载安装ros_qtc_plugin的版本也要为10.0版本 2、安装 ros_qtc_plugin 2.1 下载插件 github:https://github.com/ros-industrial…

基于fpga实现tft屏幕显示数字、字母

简介 开发平台&#xff1a;ZYNQ 开发工具&#xff1a;Vivado 2018.3 tft屏幕分辨率&#xff1a;800*480 在PL端使用纯verilog实现bitmap模块&#xff0c;基于该模块实现在tft屏幕显示数字0-9&#xff0c;以及FPGA字母 Bitmap模块 该模块为5*5的bitmap&#xff0c;纯组合逻辑&…

7-18作业

#include<iostream>using namespace std; class My_stack { private:int* ptr; //执行堆区空间int top;int size; //记录栈顶元素public:My_stack() :ptr(new int[10]), top(-1), size(10) {}//有参构造My_stack(int size) :ptr(new int[10]), top(-1), size(siz…

Android 网络游戏开发入门简单示例

在Android系统上开发是Android开发学习者所向往的&#xff0c;有成就感也有乐趣&#xff0c;还能取得经济上的报酬。那怎样开发Android网络游戏攻略呢&#xff1f;下面介绍一个简单的入门实例。 一、创建新工程   首先&#xff0c;我们在Eclipse中新建一个名为Movement的工程…

简单工厂模式(java)

目录 结构 案例 类图 代码实现 简单咖啡工厂类 咖啡店类 咖啡类 具体咖啡类 简单工厂方法的优缺点 优点 缺点 结构 简单工厂包含如下角色&#xff1a; 抽象产品 &#xff1a;定义了产品的规范&#xff0c;描述了产品的主要特性和功能。具体产品 &#xff1a;实现或者…

前端 | (五)CSS三大特性及常用属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;CSS三大属性&#x1f407;层叠性&#x1f407;继承性&#x1f407;优先级 &#x1f4da;CSS常用属性&#x1f407;像素的概念&#x1f407;颜色的表示⭐️表…

OCR学术前沿及产业应用高峰论坛202204

OCR学术前沿及产业应用高峰论坛 相关议程&#xff1a;https://mp.weixin.qq.com/s/LYoKHFad9D-gjhGlVF3Czg 广告OCR技术研究与应用-腾讯 视频制作ASR&#xff0c;ocr得到字幕 计算机动画CG OCR实践与技术创新 - 蚂蚁 loss优化 数据合成 对比学习的方式&#xff0c;什么样是…

让小程序动起来-轮播图的两种方式--【浅入深出系列002】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择啥是轮播图轮播图的关键代码最常见的轮播图代码便于理解的轮播代码两种轮播代码的比较 实际操练第一步&#xff0c;就是找到文件。第二步&#xff0c;先改动一下最显眼…

springboot整合feign实现RPC调用,并通过Hystrix实现降级

目录 一、服务提供者 二、服务消费者 三、测试效果 四、开启Hystrix实现降级功能 feign/openfeign和dubbo是常用的微服务RPC框架&#xff0c;由于feigin内部已经集成ribbon&#xff0c;自带了负载均衡的功能&#xff0c;当有多个同名的服务注册到注册中心时&#xff0c;会根…

数组前缀和

前缀和 前缀和就是指前缀的和&#xff0c;例如在数组中&#xff0c;从开始到 i 就是到 i 的前缀和。前缀和一般用来求中间连续某一段的和&#xff0c;例如sum[i] - sum[j - 1]就可以求出j 到 i 这一段的和。 在这一道题目里面&#xff0c;中间某一段连续子数组和为k&#xff0…

知识库分享|《快手电商中小商家成长指南》

《快手电商中小商家成长指南》致力于帮助快手电商平台的新商家、中小商家可以快速掌握电商经营流程&#xff0c;理解电商经营方法&#xff0c;提升电商经营能力&#xff0c;助力中小商家快速实现冷启。 ‼️ 包含中小商家冷启必备的六大板块两大方向&#xff1a; 基础操作、账…

SpringCloud(三)LoadBalancer负载均衡

一、负载均衡 实际上&#xff0c;在添加LoadBalanced注解之后&#xff0c;会启用拦截器对我们发起的服务调用请求进行拦截&#xff08;注意这里是针对我们发起的请求进行拦截&#xff09;&#xff0c;叫做LoadBalancerInterceptor&#xff0c;它实现ClientHttpRequestIntercep…

JAVA的swing技术到底实用不实用?

文章目录 先说结论JAVA的知识范围那为什么还要学&#xff1f; 总结 先说结论 不实用 1 尚硅谷Java入门视频教程&#xff0c;宋红康java基础视频 必须要排在第一位。1600万的播放量呀。 717集 我的天啦&#xff01; 目录&#xff1a; Java视频及配套资料下载指南 尚硅谷Java基…

有效的括号(C)

bool isValid(char* s) {ST st;StackInit(&st);while (*s) //遍历 -- 与\0终止{//是左括号 压栈if (*s ( || *s [ *s {){StackPush(&st, *s);s;}else{//应对样例&#xff1a; ’]if (StackEmpty(&st)){StackDestroy(&st);return false;}//不是左括号 应该就…

【Flink】详解Flink任务提交流程

启动一个任务 通常我们会使用 bin/flink run -t yarn-per-job -c com.xxx.xxx.WordCount/WordCount.jar 方式启动任务&#xff1b;我们看一下 flink文件中到底做了什么&#xff0c;以下是其部分源码 # Convert relative path to absolute path bindirname "$target"…

快速搭建机器学习demo: gradio教程

1. Intro gradio是一个能够快速建立机器学习demo web应用的工具&#xff0c;仅需简单的几行代码就能构建机器学习模型的可视化交互demo&#xff0c;并分享给你的朋友使用。 与gradio相同功能的竞品有Streamlit&#xff0c;相比Gradio&#xff0c;Streamlit相对复杂&#xff0…

热门二叉树面试题

606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&a…

Baichuan-13B:130亿参数的开源语言模型,引领中文和英文benchmark

Baichuan-13B: 一个强大的开源大规模语言模型 标题&#xff1a;Baichuan-13B&#xff1a;130亿参数的开源语言模型&#xff0c;引领中文和英文benchmark Baichuan-13B是由百川智能开发的一个开源大规模语言模型项目&#xff0c;包含了130亿参数。该模型在中文和英文的权威ben…