美文网首页
Unity 实战【飞机大战】

Unity 实战【飞机大战】

作者: 程序员阿兵 | 来源:发表于2022-08-16 09:13 被阅读0次

    【简介】

    • 该游戏主要的功能是通过键盘控制飞机的移动,飞机发出的子弹和野怪发生碰撞则销毁野怪会产生爆炸效果且销毁野怪。
    8dc8b875d37299b83c5044f0e7c2511e.gif

    将项目可拆解成以下几个模块:

    1.导入游戏素材
    2.添加游戏背景天空盒子
    3.生成player 玩家模型以及控制脚本
    4.生成野怪 模型以及控制脚本
    5.玩家发射子弹和野怪发生碰撞逻辑

    • 导入游戏素材

      image.png
      将游戏需要的资源素材导入到assest目录项目,由上面截图可以看到 添加的素材有野怪玩家的预制体,子弹的特效以及天空盒子
    • 添加游戏背景天空盒子

      image.png
      Skybox 下面的素材拖到游戏窗口中 游戏背景就会变成对应的素材效果。
    • 生成player 玩家模型以及控制脚本
      1.将player 模型拖到视野中调整好坐标位置



      2.编写控制player 的脚本挂载到player comment上


      image.png
    • 生成野怪 模型以及控制脚本


      image.png
    • 玩家发射子弹和野怪发生碰撞逻辑
      下面分析一下挂载在player 和野怪身上的脚本

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerLogic : MonoBehaviour
    {
        [Tooltip("子弹的预制体")]
        public GameObject bulletPrefab;
    
        [Tooltip("子弹发射位置")]
        public Transform bulletFolder;
    
        [Tooltip("")]
        public Transform firePoint;
    
        [Tooltip("子弹生成的时间间隔")]
        public float fireInterval = 0.1f;
    
        [Tooltip("player 移动速度")]
        public float moveSpeed = 0.1f;
    
        // Start is called before the first frame update
        void Start()
        {
            InvokeRepeating("Fire", fireInterval, fireInterval);
        }
    
        // Update is called once per frame
        void Update()
        {
            float dx = 0;
    
            if (Input.GetKey(KeyCode.A))
            {
                dx = -moveSpeed;
            }
            if (Input.GetKey(KeyCode.D))
            {
                dx = moveSpeed;
            }
            this.transform.Translate(dx, 0, 0, Space.Self);
        }
    
        private void Fire()
        {
            // ʵ����һ���ӵ��ڵ�
            GameObject node = Instantiate(bulletPrefab, bulletFolder);
    
            // ���ӵ��ƶ���������λ�� 
            node.transform.position = firePoint.position;
        }
        
    }
    
    

    上面的playerLogic 主要的逻辑是 在player 下面添加了bulletFolder 子弹动态生成在指定的目录一下 以及bulletPrefab子弹的预制体生成。通过

    InvokeRepeating("Fire", fireInterval, fireInterval);
    

    不断生成bulletPrefab 子弹且子弹的朝向位置为firePoint的坐标朝向,一直不断transform 移动到野怪方向。
    野怪身上的脚本EnemyLogic

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class EnemyLogic : MonoBehaviour
    {
        [Tooltip("ǰ���ٶ�")]
        public float zSpeed = 10;
    
        // �����ٶ�
        float xSpeed = 0;
    
        // Start is called before the first frame update
        void Start()
        {
            // ÿ��ı�һ�κ����ٶ�
            InvokeRepeating("SnakeMove", 1f, 1f);
        }
    
        // Update is called once per frame
        void Update()
        {
            float dz = zSpeed * Time.deltaTime;
            float dx = xSpeed * Time.deltaTime;
    
            this.transform.Translate(dx, 0, dz, Space.Self);
        }
    
        // ��Ƥ��λ
        void SnakeMove()
        {
            // 4 ���ٶ�ѡ��
            float[] options = { -10, -5, 5, 10 };
    
            int sel = Random.Range(0, options.Length);
    
            xSpeed = options[sel];
        }
    }
    
    

    EnemyLogic 主要逻辑是随机再dz 以及dx 以不同的速度去偏移Translate,使得野怪有不同的朝向

    子弹和野怪发生碰撞:

    image.png

    在子弹身上有BulletLogic 脚本

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class BulletLogic : MonoBehaviour
    {
        public float speed = 1;
    
        public float lifetime = 3;
    
        public GameObject explosionEffect;
    
        // Start is called before the first frame update
        void Start()
        {
            Invoke("SelfDestroy", lifetime);
        }
    
        // Update is called once per frame
        void Update()
        {
            transform.Translate(0, 0, speed * Time.deltaTime, Space.Self);
        }
    
        private void OnTriggerEnter(Collider other)
        {
    
            if (!other.name.StartsWith("怪兽")) return;
    
            Destroy(this.gameObject);
    
            Destroy(other.gameObject);
    
            GameObject effectNode = Instantiate(explosionEffect, null);
            effectNode.transform.position = this.transform.position;
        }
    
        private void SelfDestroy()
        {
            Destroy(this.gameObject);
        }
    
    }
    
    

    上面的脚本逻辑是 当前如果发生碰撞的other.name 是怪兽则复合碰撞逻辑,就销毁掉子弹和碰撞的怪兽 且添加碰撞💥动效预制体。

    以上为所有该小游戏的逻辑

    相关文章

      网友评论

          本文标题:Unity 实战【飞机大战】

          本文链接:https://www.haomeiwen.com/subject/risrgrtx.html