Unity百游修炼(17)——飞船大战详细全流程

一.前言

        本教程将带领大家一步步打造一个简单的太空射击游戏,通过详细的步骤和代码解析,让大家了解游戏开发中的基础操作和逻辑实现。无论是新手开发者想要入门,还是有一定经验的开发者想要巩固知识,都能从本教程中有所收获。


二.最终效果

        玩家操控一艘飞船在屏幕中穿梭,能够左右、上下移动按下空格键可以发射子弹,子弹从飞船前方的开火点射出。场景中会不断有敌机从随机位置生成并向玩家飞来,当敌机与玩家飞船碰撞或者玩家子弹击中敌机时,敌机被销毁。如果玩家飞船与敌机发生碰撞,游戏结束,时间停止。同时,游戏背景为绚丽的太空天空盒,营造出逼真的太空氛围。

unity5.6


三.素材

飞机资源:Star Sparrow Modular Spaceship | 3D 宇宙飞船 | Unity Asset Store

        该资源提供了精美的 3D 飞船模型,我们将从中选取一艘作为玩家操控的飞船。丰富的模型细节能够提升游戏的视觉效果,使玩家更好地沉浸在游戏世界中。

天空资源:8K Skybox Pack Free | 2D 天空 | Unity Asset Store

        此资源包含高质量的 2D 天空盒素材,用于设置游戏的背景。8K 的分辨率能够提供清晰、绚丽的太空背景,增强游戏的场景真实感。


四.实现路径

1.下载资源并导入飞船。

2.限定飞船的移动范围;如果碰到敌机,则游戏结束。

3.优化天空盒效果,让飞船置身于云层之中。

4.敌机向玩家飞来,超出摄像机自动销毁。

5.随机生成敌机。

6.发射子弹,2s后自动销毁,触及物体后自动销毁。


五.详细操作步骤

1.导入玩家飞船

(1)下载并导入资源。在prefab中选中一个飞机作为Player

(2)选中Player,右键创建一个空对象,命名为FirePoint,作为后期开火点。

(3)将FirePoint放置到飞机的正前方

2.移动飞船

(1)为Player添加rigidbody组件。

(2)创建一个脚本PlayerControl,然后挂载到Player身上。

代码如下:

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

public class PlayerControl56 : MonoBehaviour
{
    public GameObject BulletPre;

    private Transform firepoint;
    // Start is called before the first frame update
    void Start()
    {
        firepoint = transform.Find("FirePoint");
    }

    // Update is called once per frame
    void Update()
    {
        //横向飞行
        float xvalue = Input.GetAxisRaw("Horizontal");
        if (xvalue != 0)
        {
            transform.position -= Vector3.left * 20f * Time.deltaTime * xvalue;
            if (transform.position.x < -10 || transform.position.x > 10)
            {
                transform.position += Vector3.left * 20f * Time.deltaTime * xvalue;
            }
        }

        //纵向飞行
        float yvalue = Input.GetAxisRaw("Vertical"); 
        if (yvalue != 0)
        {
            transform.position += Vector3.up * 20f * Time.deltaTime * yvalue;
            if (transform.position.y < -15 || transform.position.y > 15)
            {
                transform.position -= Vector3.up * 20f * Time.deltaTime * yvalue;
            }
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            Instantiate(BulletPre, firepoint.position, firepoint.rotation);
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("游戏结束");
        Time.timeScale = 0;
    }
}

3.添加天空环境

(1)下载,导入天空资源。

(2)在main camera上添加Sky box组件,拖入你喜欢的天空背景

4.导入敌人飞船

(1)拖拽一个敌机模型到场景中,命名为Enemy,并且标签为Enemy。其朝向为屏幕,即Rotation:Y=180。添加rigidbody组件,并取消勾选Use Gravity

(2)敌机超出摄像机范围即自动销毁,创建一个脚本EnemyControl,然后挂载到Enemy。最后把Enemy转换为预制体,层级面板的Enemy即可删除。

代码如下:

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

public class EnemyControl : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.position -= Vector3.forward*Time.deltaTime*25f;
        if(transform.position.z<-20)
        {
            Destroy(gameObject);
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Bullet")
        {
            Destroy(gameObject);
        }
    }
}

5.生成敌机

(1)创建一个空物体,命名为EnemyPoint,然后再Transform组件中,设置生成点位置参数(根据你自己观察)

(2)设置一个脚本EnemyPointControl,然后将其挂载到EnemyPoint物体上。

代码如下:

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

public class EnemyPoint : MonoBehaviour
{
    public GameObject EnemyPre;
    private float time_Enemy = 0;
    private float CD = 1f;          
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        time_Enemy += Time.deltaTime;
        if(time_Enemy>CD)
        {
            time_Enemy= 0;
            CD = Random.Range(0.3f, 3f);
            Vector3 pos = transform.position + Vector3.left * Random.Range(-10f, 10f) + Vector3.up * Random.Range(-10f, 10f);
            Instantiate(EnemyPre, pos, transform.rotation);
        }
    }
}

6.添加玩家攻击

(1)创建一个圆柱体,然后命名为Bullet,同时设置一个标签Bullet。然后调整transform参数,使其平躺下来。勾选“触发器”选项,同时添加rigidbody组件,取消重力选项。

(2)创建一个脚本BulletControl,然后挂载到Bullet上。

代码如下:

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

public class BulletControl : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Destroy(gameObject, 2f) ;
        GetComponent<Rigidbody>().velocity=Vector3.forward*50 ;
    }

    private void OnTriggerEnter(Collider other)
    {
        Destroy(gameObject) ;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

(3)将其转换为预制体,然后删除这个bullet。继续完善PlayControl代码

代码如下:

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

public class PlayerControl56 : MonoBehaviour
{
    public GameObject BulletPre;

    private Transform firepoint;
    // Start is called before the first frame update
    void Start()
    {
        firepoint = transform.Find("FirePoint");
    }

    // Update is called once per frame
    void Update()
    {
        //横向飞行
        float xvalue = Input.GetAxisRaw("Horizontal");
        if (xvalue != 0)
        {
            transform.position -= Vector3.left * 20f * Time.deltaTime * xvalue;
            if (transform.position.x < -10 || transform.position.x > 10)
            {
                transform.position += Vector3.left * 20f * Time.deltaTime * xvalue;
            }
        }

        //纵向飞行
        float yvalue = Input.GetAxisRaw("Vertical"); 
        if (yvalue != 0)
        {
            transform.position += Vector3.up * 20f * Time.deltaTime * yvalue;
            if (transform.position.y < -15 || transform.position.y > 15)
            {
                transform.position -= Vector3.up * 20f * Time.deltaTime * yvalue;
            }
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            Instantiate(BulletPre, firepoint.position, firepoint.rotation);
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("游戏结束");
        Time.timeScale = 0;
    }
}

六.结语

        在这个过程中,我们学习了如何在 Unity 中导入资源、设置物体的属性和行为、编写控制脚本以及构建游戏场景。希望本教程能够帮助你对 Unity 游戏开发有更深入的理解和掌握。你可以根据自己的创意对游戏进行进一步的扩展和优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值