草庐IT

unity的简易飞机大战

m0_48832826 2024-06-17 原文

``
1、第一步把玩家、玩家打出的子弹、敌人、敌人打出的子弹的脚本创建出来。

2、第二步把玩家、玩家打出的子弹、敌人、敌人打出的子弹拖到场景中执行。

3、第三步就开始写脚本内容了

写脚本内容跟据需求第一步来写玩家的移动,还有控制玩家不出游戏界面,脚本如下:

private float speed = 10 ;//键盘控制的速度
    private float offSet = 10f;//飞船的偏移量
    private Rigidbody r;


    public GameObject bullet;//子弹
    public Transform pos;//弹口
    public AudioClip clip;//音频
 
    void Start () {

//获取刚体
        r = GetComponent<Rigidbody>();//这是获取刚体组件
    }
    
   
    void Update () {
        Move(); 

Fire();
       }

void Fire()
    {
        if (Input.GetButtonDown("Fire1") &&Time.time>nextTime)
        {
            nextTime = spacetime + Time.time;//下一颗子弹运行的时间=每颗子弹飞行的时间+游戏运行时间
            Instantiate(bullet, pos.position, Quaternion.identity);
        }
    }
  
void Move()
    {
        //用键盘来控制玩家飞机移动
        float x = Input.GetAxis("Horizontal")  * speed;
        float z = Input.GetAxis("Vertical") * speed;
        //transform.Translate(new Vector3(x, 0, z));
        r.velocity = new Vector3(x, 0, z);


        //设置边界值不让飞机飞出屏幕
        float xPos = Mathf.Clamp(transform.position.x, -6f, 6f);

//Mathf.Clamp(自身的x轴,边界的最小值,边界的最大值)
        float zPos = Mathf.Clamp(transform.position.z, -43f, -22f);
        transform.position = new Vector3(xPos, transform.position.y, zPos);


        //飞船的偏移
        r.rotation = Quaternion.Euler(0, 0, r.velocity.x * offSet * (-1));

//控制飞船的偏移公式为

//r.rotation=Quaternion.Euler(自身的x轴不变,自身的y轴不变,x轴的刚体*偏移量*(-1))
    }

玩家的子弹的克隆写在玩家身上脚本里比较好,子弹的脚本就给它专门写子弹的操作,子弹碰到陨石摧毁陨石产生爆炸声,子弹代码如下:

 private float speed = 2f;//控制速度
    public GameObject explosion;//爆炸声音
    void Start () {
        
    }
    void Update () {

//子弹向前飞的力
        transform.Translate(Vector3.forward * Time.deltaTime * speed);
    }
    void OnTriggerExit(Collider other)//触发器(出来的时候写这个触发器)
    {
        if (other.CompareTag("Border"))//子弹碰到你设置的一个边界触发器
        {
            Destroy(gameObject);//碰到了就把子弹摧毁
        }
    }
    void OnTriggerEnter(Collider other)//触发器(刚进这个触发器的时候)
    {
        if (other.CompareTag("Asteroid"))//碰到了陨石
        {
            Destroy(gameObject);//摧毁子弹
            Destroy(other.gameObject);//摧毁陨石
            GameObject go = Instantiate(explosion, other.gameObject.transform.position, Quaternion.identity);//克隆爆炸声音
            Destroy(go, 1f);

            GameManager.gm.score++;//这是积分器,是在后面代码中
        }
    }
   

再建一个专门管理陨石生成和血量和界面跳转等各种操作,代码如下:

我这陨石是用数组来存储的

public GameObject[] asteroids;//用数组来存储陨石
    public Text playerHpText, scoreText;//这个是要创建一个UI界面

//HideInInspector表示将原本显示在面板上的序列化值隐藏起来
    [HideInInspector]
    public int playerHp = 10;//这个是定义一个玩家的血量
    [HideInInspector]
    public int score = 0;
    public GameObject Win, gameOver;//这是个游戏的赢的界面和游戏结束的界面
//unity 单例模式
public static GameManager gm;

void Start()
{
    gm = this;//就是把本类赋值给gm
    StartCoroutine(Print());
}

//用协程来克隆陨石,用死循环来每秒克隆陨石

IEnumerator Print()
{
    
    while (true)
    {
        yield return new WaitForSeconds(3f);
        for (int i = 0; i < asteroids.Length; i++)
        {

           // 用到随机数来克隆陨石的位置
            int x = Random.Range(-6, 6);//x轴随机
            int z = Random.Range(-21, -22);
            Vector3 pos = new Vector3(x, 0.28f, z);
            Instantiate(asteroids[i], pos, Quaternion.identity);
            
        }
         yield return new WaitForSeconds(6f);
    }

    //}

}

void Update () {
    if (score==10)
    {
        Time.timeScale = 0;
        Win.SetActive(true);
    }
    if (playerHp==0)
    {
        Time.timeScale = 0;
        gameOver.SetActive(true);
    }
    playerHpText.text = playerHp.ToString();
    scoreText.text = score.ToString();
}

//这个两个是按钮事件,达到跳转界面效果

public void GoToStart()
{
    SceneManager.LoadScene("start");
}
public void GoToGame2()
{
    SceneManager.LoadScene("Game2");
    //Time.timeScale = 1;//这个语句是用于游戏的暂停和开启的作用
}

接下来我们来做第二个界面的脚本

第二个脚本主要是来玩家飞机来打对方飞机的第二关,要求如下:
这个需求是要求我们需要用协程或者Invoke,或者是InvokeReapting来做,现在主要使用的是协程

在Start里面启动协程


private Rigidbody r;//加刚体
	private float spacetime = 1f;//每颗子弹间隔的时间
	private float nextTime;//下一颗子弹发射的时间
	private float moveSpeed = 2f;//移动速度
	private int enemyHp = 1;


	public GameObject bullet;//敌人子弹
	public Transform pos;//敌人发射子弹的炮口
	public AudioClip clip;//爆炸特效
	public GameObject exlopion;//敌机爆炸特效

	void Start()
	{
		r = GetComponent<Rigidbody>();
	}

	// Update is called once per frame
	void Update()
	{
		r.velocity = Vector3.back * moveSpeed;//自动下落速度
		Fire();
	}
	void Fire()
	{
		if ( Time.time > nextTime)
		{
			nextTime = spacetime + Time.time;//下一颗子弹运行的时间=每颗子弹飞行的时间+游戏运行时间
			// nAudioSource.PlayClipAtPoint(clip, transform.position, 1);
			Instantiate(bullet, pos.position, Quaternion.identity);
		}
	}
    void Move()
    {

        //设置边界值不让飞机飞出屏幕
        float xPos = Mathf.Clamp(transform.position.x, -6f, 6f);
        float zPos = Mathf.Clamp(transform.position.z, -43f, -22f);
        transform.position = new Vector3(xPos, transform.position.y, zPos);
    }
    //这也是用碰撞器来摧毁敌人和敌人子弹子弹
    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
			enemyHp--; 
			if (enemyHp <= 0)
			{
				GameObject go = Instantiate(exlopion, transform.position, Quaternion.identity);
				//Destroy(go, 1f);
				Destroy(gameObject);
		    }
		}
        if (other.CompareTag("PlayerBullet"))
        {
			enemyHp--;
			Destroy(other.gameObject);
			if (enemyHp <= 0)
			{
				GameObject go = Instantiate(exlopion, transform.position, Quaternion.identity);
				//Destroy(go, 1f);
				Destroy(gameObject);
			}
		}
    }
    //用碰撞器来摧毁那些没有被飞机打到敌机
	void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Border"))
        {
			Destroy(gameObject);
        }
    }

这个敌人飞机就跟上面的陨石一样生成,这边就偷下懒,就不仔细写了

void Start(){

           StartCoroutine(Clone());

}

IEnumerator Clone()
    {
        while (true)
        {
            yield return new WaitForSeconds(8f);
            for (int i = 0; i < enemy.Length; i++)
            {
                int x = Random.Range(-6, 6);
                int z = Random.Range(-27, -14);
                Vector3 pos = new Vector3(x, 0.29f, z);
                Instantiate(enemy[i], pos, Quaternion.identity);
            }
            yield return new WaitForSeconds(8f);
        }



这里写的代码是敌人子弹的代码
private float speed = 5f;//这是定义的速度
	void Start () {
	
	}
	void Update () {
		transform.Translate(Vector3.back * Time.deltaTime * speed);//给了子弹位移
	}
	void OnTriggerExit(Collider other)
	{
		if (other.CompareTag("Border"))
		{
			Destroy(gameObject);
		}
	}
	void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
			GameManager1.gm1.playerHp--;
			Destroy(gameObject);//摧毁的是敌人的子弹
        }
    }
这是一个UI界面的代码,主要的作用是实现登录注册的功能
public InputField nameInput, pwdInput;
	public void RegButton()
    {
    //这是用本地存储来存储玩家输入的账号密码
        PlayerPrefs.SetString("name",nameInput.text);
        PlayerPrefs.SetString("pwd", pwdInput.text);
    }
    public void LoginButton()
    {
    //用GetString来读取存储在本地内存里面的数据
       string name= PlayerPrefs.GetString("name");
      string pwd=  PlayerPrefs.GetString("pwd");
      //符合这注册的账号密码就可以登录
        if (name==nameInput.text&&pwd==pwdInput.text)
        {
            SceneManager.LoadScene("Game");
            Time.timeScale = 1;
        }
    }

有关unity的简易飞机大战的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  3. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  4. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  5. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  6. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  7. 三分钟集成 TapTap 防沉迷 SDK(Unity 版) - 2

    三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应

  8. 【Unity大气散射】GAMES104:3A中如何实现大气散射 - 2

    写在前面前两天学习并整理的大气散射基础知识:【Unity大气渲染】关于单次大气散射的理论知识,收获了很多,但不得不承认的是,这其实已经是最早的、90年代的非常古老的方法了,后来也出现了一些优化性的计算思路和方法。因此,我打算先不急着跟各种教程在Unity中实现大气散射,而是再花时间来看看最近的游戏是如何去实现大气渲染的:06.游戏中地形大气和云的渲染(下)|GAMES104-现代游戏引擎:从入门到实践接下来就跟着GAMES104讲地形大气和云渲染的部分学习并做简单的记录,涉及到之前没提到的Mie散射也只选择直接截图PPT的方式记录啦!毕竟对于做作品来说,之后实现出来才是重要的~当然,May佬的

  9. ruby - 使用 Ruby 编写 Unity 游戏 - 2

    所以我看到unity支持c#、JS和Boo。我可以学习其中一个,但我想制作一个“编译器”或类似的东西,让我可以编写ruby​​代码并输出JS代码或制作一个可以被Unity编译器读取的层。这有可能吗?我愿意在这方面投入很多时间并且有相当多的经验。 最佳答案 如果您的问题实际上是“我如何将Ruby编译为JavaScript”,那么这更容易回答:Opal:RubytoJavaScriptcompiler但是,学习其中一种受支持的语言会更好。当运行的是用另一种语言解释的代码时,很难调试“您的”代码。

  10. Unity常用文件夹 - 2

    1.Scenes游戏场景文件夹用于放置unity的场景文件 2.Plugins插件文件夹用于放置unity的依赖文件,例如dll 3.Scripts脚本文件夹用于放置unity的c#脚本文件 4.Resources游戏资源文件夹用于放置unity的各种游戏资源,比如images,prefabs,同时只有放到Resources文件夹的游戏资源才能使用Resource.load(资源路径不加后缀)加载到游戏内存中进行使用 5.EditorUnity编辑器扩展脚本文件夹usingUnityEditor;这个名称空间就是Unity编辑器的名称空间这个名称空间提供了扩展Unity编辑器的各种类 【你所有

随机推荐