一.前言
本教程将带领大家一步步打造一个简单的太空射击游戏,通过详细的步骤和代码解析,让大家了解游戏开发中的基础操作和逻辑实现。无论是新手开发者想要入门,还是有一定经验的开发者想要巩固知识,都能从本教程中有所收获。
二.最终效果
玩家操控一艘飞船在屏幕中穿梭,能够左右、上下移动。按下空格键可以发射子弹,子弹从飞船前方的开火点射出。场景中会不断有敌机从随机位置生成并向玩家飞来,当敌机与玩家飞船碰撞或者玩家子弹击中敌机时,敌机被销毁。如果玩家飞船与敌机发生碰撞,游戏结束,时间停止。同时,游戏背景为绚丽的太空天空盒,营造出逼真的太空氛围。
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 游戏开发有更深入的理解和掌握。你可以根据自己的创意对游戏进行进一步的扩展和优化。