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

这篇具有很好参考价值的文章主要介绍了【unity之IMGUI实践】游戏玩法逻辑实现【四】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机


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

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

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unityUI专题篇
【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机


⭐抽象父类继承实现⭐

【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机



🎶前言

【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机


🅰️


🎶(A)常用关键API


【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机
【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机


🎶(B)需求分析


【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机


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


【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机


  • Target Texture 行为渲染

——————————————【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机
___________________________【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机

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)行为实现——捡起武器发射炮弹


【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机
【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机

【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机

😶‍🌫️ 步骤


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)行为实现——炮弹的销毁和特效


【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机

——————————【unity之IMGUI实践】游戏玩法逻辑实现【四】,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏,数码相机

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大全(万字详解),不信你不收藏



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

到了这里,关于【unity之IMGUI实践】游戏玩法逻辑实现【四】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【2023unity游戏制作-mango的冒险】-7.玩法实现

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity常用API 🅰️ 让CSDN的浪漫弥漫女神节 💕 ⭐【2023unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随 ⭐【2023unity游戏制作-

    2024年02月10日
    浏览(33)
  • 【unity之IMGUI实践】单例模式管理面板对象【一】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ API:简单的旋转 解析: 1.采用单例模式,原因: 单例模式无法被纂改基类,适合当管理者 2.基类提取了子类所有的共

    2024年02月15日
    浏览(41)
  • 【unity之IMGUI实践】单例模式管理数据存储【二】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ 😶‍🌫️:步骤实现 1.首先将音乐数据封装在类中,不采用单例模式 2. 而后封装一个游戏数据类为单例模式:功能

    2024年02月16日
    浏览(43)
  • Unity开发日记-进入游戏按钮和退出游戏按钮的逻辑实现

    本篇文章只是总结一下UGUI中进入游戏和退出游戏的逻辑代码的两种实现方式,方便以后查阅,以后如果有其他的方法也会随时更新(Unity版本为2021) 首先是在UI的Image(背景图)上挂载脚本 代码如下 两种方法各有各的好。方法一代码量少但项目大的时候管理比较麻烦;方法

    2024年02月11日
    浏览(49)
  • 【Unity3D游戏魔坦之争】敌方逻辑封装实现【六】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ 😶‍🌫️:步骤实现 1.炮台的行为逻辑封装:旋转,触发检测,发射炮弹及特效 2.检测玩家后自动瞄准攻击 3.玩家扣

    2024年02月11日
    浏览(43)
  • Unity中敌人简单逻辑的实现(来回走动,攻击)2D

    unity自带一套自动巡航系统,但是目前应该先了解最基本的使用代码控制敌人实现逻辑(1来回走动,2发现玩家时追着玩家,3进入敌人攻击范围时进行攻击),一般来说这是最基本的敌人的功能 分析完敌人所具备的能力后,就将敌人的能力进行拆解,分别进行实现 一 来回走

    2024年02月12日
    浏览(39)
  • Unity3D 如何把全部游戏逻辑都放到lua层实现详解

    Unity3D是一款非常流行的游戏开发引擎,它支持C#、JavaScript和Boo等脚本语言。然而,有时候我们可能希望将全部游戏逻辑都放到Lua层实现,这样可以更方便地进行游戏逻辑的修改和调试。本文将详细介绍如何使用Unity3D将全部游戏逻辑都放到Lua层实现。 对啦!这里有个游戏开发

    2024年01月16日
    浏览(47)
  • unity 简单实现三阶魔方游戏

    魔方体验地址 工程文件免费下载 实现思路 一、魔方的旋转 三阶魔方由26个方块与 9个旋转轴组成。旋转轴旋转时带动在其控制范围的方块旋转。 旋转轴如何带动方块旋转? 把旋转轴控制范围内的方块设置成旋转轴的子物体,旋转轴旋转时便会带动子物体旋转。 如何得到旋

    2024年02月12日
    浏览(34)
  • Unity 简单跑酷游戏策划与实现

    游戏名称:无尽探险跑酷(Endless Adventure Runner) 游戏类型:无尽跑酷 游戏背景 在一个充满未知和奇迹的世界中,玩家将扮演一名勇敢的探险家,穿越各种神秘的地域,躲避重重障碍,收集宝藏,并挑战自己的极限。 核心玩法 跑酷冒险 :玩家控制角色在无尽的道路上不断前

    2024年02月03日
    浏览(41)
  • 【Unity实战】实现一款简单的FPS游戏

    实现一款FPS游戏需要以下步骤: 1.创建场景:在Unity中创建3D场景,设定地形、灯光、天气等环境,新增角色、武器等道具。 2.角色控制:创建角色,并添加Unity内置的角色控制器或自定义控制器脚本,处理角色的移动、射击、跳跃、动作等。 3.武器系统:创建武器模型,添加

    2024年02月06日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包