3Dunity游戏项目实战——飞机大战

太空射击游戏开发详解
本文档详述了一个太空背景的射击游戏的策划与代码实现。游戏主角在火星上空与不同类型的敌人战斗,通过射击敌人得分,生命值耗尽则游戏结束。游戏包括主角、子弹、敌人、敌人生成器和游戏管理器等多个组件,每个组件都有详细的脚本实现,如主角的碰撞检测、敌人的生成与移动、子弹的发射和销毁等。此外,还介绍了游戏的UI设计和暂停、重新开始功能。

代码及游戏资料

一、游戏策划

1、游戏介绍

  游戏背景是在火星的上空,主角和敌人是不同的太空飞行器,敌人迎面向主角飞来,主角通过射击消灭敌人来获得分数。如果主角战败,则游戏结束。

2、游戏UI

  屏幕上显示主角生命值以及得分。如果游戏结束,屏幕上显示“游戏结束“,同时显示“再来一次”按钮。按ESC键,游戏会处于暂停状态,显示“继续游戏”,“退出游戏”。

3、主角

  主角有三条性命,被敌人撞击一次性命直接清零,被敌方子弹命中,性命减一,当性命值为0时,游戏结束。

4、操作

  游戏在pc上进行开发,键盘上的上下左右键控制角色在相应位置上移动。空格键和鼠标左键控制发射子弹。

5、敌人

  敌人分为两类:初级敌人,装甲较弱,以撞击主角为主;高级敌人,装甲较强,可以发射子弹,也可以撞击主角。

二、代码分析

1、创建地图

  • 在Scene中创建一个3D的Plane对象,用星空的图像作为背景
  • 另外创建一个3D对象,用火星的图像贴图
  • 为星空的Plane对象添加动画效果,使在太空的背景更加逼真。
  • 在地图的周围设置空对象,当敌人走出地图时,要及时销毁对象,节省内存。

2、创建主角和子弹

  • 创建主角的Object对象,并贴图
  • 创建子弹的Object对象,并贴图。这里由于子弹是可重复使用对象,于是将其变为profeb预设对象,只要将Scene中创建好的对象拖进Project相应文件夹中即可。
  • 为场景中的对象添加相关tag,并在对象中指定tag名
    在这里插入图片描述
  • 为主角添加碰撞容器,并在脚本里实现碰撞效果
    在这里插入图片描述
  • 为主角添加Audio source容器,这样才能有声音,并在脚本中添加开枪声音以及爆炸特效。
  • 为主角和子弹创建相应脚本,指定脚本中的Transform对象
// Palyer.cs

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

[AddComponentMenu("MyGame/Player")]
public class Player : MonoBehaviour
{
   
   
    public float m_life = 3;//主角共3条命
    public float m_speed = 3; //控制主角移动速度
    float m_rocketRate = 0.3f; //控制子弹发射频率

    private float m_rocketspeed = 0;
    public Transform m_rocket;   
    protected Transform m_transform;


    public AudioClip m_shootClip; //声音
    protected AudioSource m_audio; //声音源
    public Transform m_explosionFX; //爆炸特效
    public Transform m_explosionFX2; //爆炸特效

    // Start is called before the first frame update
    void Start()
    {
   
   
        m_transform = this.transform;
        m_audio = this.GetComponent<AudioSource>();
    }

    private void OnTriggerEnter(Collider other)
    {
   
   
        if (other.tag.CompareTo("EnemyRocket") == 0)  //碰到敌人的子弹,生命值减一
        {
   
   
            m_life -= 1;

            //主角掉血反馈
            Instantiate(m_explosionFX2, m_transform.position, Quaternion.identity);
            if (m_life <= 0)
            {
   
   

                //主角死亡爆炸特效
                Instantiate(m_explosionFX, m_transform.position, Quaternion.identity);
                Destroy(this.gameObject);
            }
        }
        if (other.tag.CompareTo("Enemy") == 0)  //碰到敌人,生命值清零并销毁
        {
   
   
            m_life = 0;

            //主角死亡爆炸特效
            Instantiate(m_explosionFX, m_transform.position, Quaternion.identity);
            Destroy(this.gameObject);
        }
    }
    // Update is called once per frame
    void Update()
    {
   
   
        float moveV = 0; //纵向距离
        float moveH = 0; //横向距离


        if (Input.GetKey(KeyCode.DownArrow))
        {
   
   
            moveV += m_speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
   
   
            moveV -= m_speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
   
   
            moveH -= m_speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
   
   
            moveH += m_speed * Time.deltaTime;
        }

        m_rocketspeed -= Time.deltaTime;
        if (m_rocketspeed <= 0)
        {
   
   
            m_rocketspeed = m_rocketRate;
            if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
            {
   
   
                Instantiate(m_rocket, new Vector3(m_transform.position.x,m_transform.position.y,m_transform.position.z + 0.5f), m_transform.rotati
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值