zoukankan      html  css  js  c++  java
  • Space Shooter 学习

    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 背景滚动
    /// </summary>
    public class Done_BGScroller : MonoBehaviour
    {
        /// <summary>
        /// 滚动速度
        /// </summary>
        public float scrollSpeed;
        /// <summary>
        /// z轴的长度
        /// </summary>
        public float tileSizeZ;
    
        /// <summary>
        /// 背景起始位置
        /// </summary>
        private Vector3 startPosition;
    
        void Start ()
        {
            //缓存起始位置
            startPosition = transform.position;
        }
    
        void Update ()
        {
            float newPosition = Mathf.Repeat(Time.time * scrollSpeed, tileSizeZ);
            transform.position = startPosition + Vector3.forward * newPosition;
        }
    }
    BGScroller
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 被边界摧毁
    /// </summary>
    public class Done_DestroyByBoundary : MonoBehaviour
    {
        /// <summary>
        /// 敌人,陨石等离开边界被摧毁
        /// </summary>
        void OnTriggerExit (Collider other) 
        {
            Destroy(other.gameObject);
        }
    }
    DestroyByBoundary
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 主角被敌对物碰到后销毁
    /// </summary>
    public class Done_DestroyByContact : MonoBehaviour
    {
        /// <summary>
        /// 爆炸特效
        /// </summary>
        public GameObject explosion;
        /// <summary>
        /// 玩家爆炸特效
        /// </summary>
        public GameObject playerExplosion;
        /// <summary>
        /// 玩家得分
        /// </summary>
        public int scoreValue;
        /// <summary>
        /// 游戏控制器
        /// </summary>
        private Done_GameController gameController;
    
        void Start ()
        {
            GameObject gameControllerObject = GameObject.FindGameObjectWithTag ("GameController");
            if (gameControllerObject != null)
            {
                gameController = gameControllerObject.GetComponent <Done_GameController>();
            }
            if (gameController == null)
            {
                Debug.Log ("Cannot find 'GameController' script");
            }
        }
    
        /// <summary>
        /// 碰到触发器
        /// </summary>
        /// <param name="other"></param>
        void OnTriggerEnter (Collider other)
        {
            //如果是边界或敌人则不处理
            if (other.tag == "Boundary" || other.tag == "Enemy")
            {
                return;
            }
    
    
            if (explosion != null)
            {
                Instantiate(explosion, transform.position, transform.rotation);
            }
    
            //如果碰到玩家,实例化玩家爆炸特效
            //游戏结束
            if (other.tag == "Player")
            {
                Instantiate(playerExplosion, other.transform.position, other.transform.rotation);
                gameController.GameOver();
            }
            
            //
            gameController.AddScore(scoreValue);
            //删除碰到的游戏物体
            Destroy (other.gameObject);
            //删除自身游戏物体
            Destroy (gameObject);
        }
    }
    DestroyByContact
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 特效经过一段时间后销毁
    /// </summary>
    public class Done_DestroyByTime : MonoBehaviour
    {
        /// <summary>
        /// 生存周期
        /// </summary>
        public float lifetime;
    
        void Start ()
        {
            
            Destroy (gameObject, lifetime);
        }
    }
    DestroyByTime
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 敌机的躲避策略
    /// </summary>
    public class Done_EvasiveManeuver : MonoBehaviour
    {
        /// <summary>
        /// 边界
        /// </summary>
        public Done_Boundary boundary;
        /// <summary>
        /// 倾斜
        /// </summary>
        public float tilt;
        /// <summary>
        /// 闪避
        /// </summary>
        public float dodge;
        public float smoothing;
        /// <summary>
        /// 
        /// </summary>
        public Vector2 startWait;
        /// <summary>
        /// 
        /// </summary>
        public Vector2 maneuverTime;
        /// <summary>
        /// 
        /// </summary>
        public Vector2 maneuverWait;
    
        private float currentSpeed;
        private float targetManeuver;
    
        void Start ()
        {
            currentSpeed = GetComponent<Rigidbody>().velocity.z;
            StartCoroutine(Evade());
        }
        
        /// <summary>
        /// 躲避协程
        /// </summary>
        /// <returns></returns>
        IEnumerator Evade ()
        {
            yield return new WaitForSeconds (Random.Range (startWait.x, startWait.y));
            while (true)
            {
                targetManeuver = Random.Range (1, dodge) * -Mathf.Sign (transform.position.x);
                yield return new WaitForSeconds (Random.Range (maneuverTime.x, maneuverTime.y));
                targetManeuver = 0;
                yield return new WaitForSeconds (Random.Range (maneuverWait.x, maneuverWait.y));
            }
        }
        
        void FixedUpdate ()
        {
            float newManeuver = Mathf.MoveTowards (GetComponent<Rigidbody>().velocity.x, targetManeuver, smoothing * Time.deltaTime);
            GetComponent<Rigidbody>().velocity = new Vector3 (newManeuver, 0.0f, currentSpeed);
            GetComponent<Rigidbody>().position = new Vector3
            (
                Mathf.Clamp(GetComponent<Rigidbody>().position.x, boundary.xMin, boundary.xMax), 
                0.0f, 
                Mathf.Clamp(GetComponent<Rigidbody>().position.z, boundary.zMin, boundary.zMax)
            );
            
            GetComponent<Rigidbody>().rotation = Quaternion.Euler (0, 0, GetComponent<Rigidbody>().velocity.x * -tilt);
        }
    }
    EvasiveManeuver
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 游戏控制
    /// </summary>
    public class Done_GameController : MonoBehaviour
    {
        /// <summary>
        /// 敌人预设列表
        /// </summary>
        public GameObject[] hazards;
        /// <summary>
        /// 敌人孵化的范围
        /// </summary>
        public Vector3 spawnValues;
        /// <summary>
        /// 每波敌人的数量
        /// </summary>
        public int hazardCount;
    
        /// <summary>
        /// 生成每个敌人后的等待时间
        /// </summary>
        public float spawnWait;
    
        /// <summary>
        /// 第一次孵化敌人的等待时间
        /// </summary>
        public float startWait;
        /// <summary>
        /// 生成每波敌人后的生成时间
        /// </summary>
        public float waveWait;
        
        /// <summary>
        /// 分数文本
        /// </summary>
        public GUIText scoreText;
        /// <summary>
        /// 重新开始文本
        /// </summary>
        public GUIText restartText;
        /// <summary>
        /// 游戏结束文本
        /// </summary>
        public GUIText gameOverText;
        
        /// <summary>
        /// 游戏是否结束
        /// </summary>
        private bool gameOver;
        /// <summary>
        /// 是否重新开始
        /// </summary>
        private bool restart;
        /// <summary>
        /// 得分
        /// </summary>
        private int score;
        
        void Start ()
        {
            gameOver = false;
            restart = false;
            restartText.text = "";
            gameOverText.text = "";
            score = 0;
            UpdateScore ();
            StartCoroutine (SpawnWaves ());
        }
        
        void Update ()
        {
            if (restart)
            {
                if (Input.GetKeyDown (KeyCode.R))
                {
                    Application.LoadLevel (Application.loadedLevel);
                }
            }
        }
        
        /// <summary>
        /// 孵化波
        /// </summary>
        /// <returns></returns>
        IEnumerator SpawnWaves ()
        {
            //等待
            yield return new WaitForSeconds (startWait);
            //无限生成敌人
            while (true)
            {
                //生成敌人
                for (int i = 0; i < hazardCount; i++)
                {
                    GameObject hazard = hazards [Random.Range (0, hazards.Length)];
                    Vector3 spawnPosition = new Vector3 (Random.Range (-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
                    Quaternion spawnRotation = Quaternion.identity;
                    Instantiate (hazard, spawnPosition, spawnRotation);
                    yield return new WaitForSeconds (spawnWait);
                }
    
                //生成每波敌人后的等待时间
                yield return new WaitForSeconds (waveWait);
                
                if (gameOver)
                {
                    restartText.text = "Press 'R' for Restart";
                    restart = true;
                    break;
                }
            }
        }
        
        /// <summary>
        /// 添加分数
        /// </summary>
        /// <param name="newScoreValue"></param>
        public void AddScore (int newScoreValue)
        {
            score += newScoreValue;
            UpdateScore ();
        }
        
        /// <summary>
        /// 更新分数显示文本
        /// </summary>
        void UpdateScore ()
        {
            scoreText.text = "Score: " + score;
        }
        
        /// <summary>
        /// 游戏结束
        /// </summary>
        public void GameOver ()
        {
            gameOverText.text = "Game Over!";
            gameOver = true;
        }
    }
    GameController
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 移动类
    /// </summary>
    public class Done_Mover : MonoBehaviour
    {
        /// <summary>
        /// 移动速度
        /// </summary>
        public float speed;
    
        void Start ()
        {
            //给刚体设置一个初始速度
            GetComponent<Rigidbody>().velocity = transform.forward * speed;
        }
    }
    Mover
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 边界
    /// </summary>
    [System.Serializable]
    public class Done_Boundary 
    {
        public float xMin, xMax, zMin, zMax;
    }
    
    /// <summary>
    /// 玩家控制
    /// </summary>
    public class Done_PlayerController : MonoBehaviour
    {
        /// <summary>
        /// 移动速度
        /// </summary>
        public float speed;
    
        /// <summary>
        /// 倾斜
        /// </summary>
        public float tilt;
        /// <summary>
        /// 游戏边界
        /// </summary>
        public Done_Boundary boundary;
    
        /// <summary>
        /// 子弹预设
        /// </summary>
        public GameObject shot;
        /// <summary>
        /// 子弹射出的位置
        /// </summary>
        public Transform shotSpawn;
        /// <summary>
        /// 射击频率,每秒发射子弹数
        /// </summary>
        public float fireRate;
        
        /// <summary>
        /// 下一次子弹发射的时间
        /// </summary>
        private float nextFire;
        
        void Update ()
        {
            //按下发射,且当前时间大于下一次子弹发射的时间
            if (Input.GetButton("Fire1") && Time.time > nextFire) 
            {
                //重新设置下一次发射子弹的时间
                nextFire = Time.time + fireRate;
                Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
                GetComponent<AudioSource>().Play ();
            }
        }
    
        void FixedUpdate ()
        {
            //获取水平和垂直方向的输入值,将其应用在刚体的速度上
            float moveHorizontal = Input.GetAxis ("Horizontal");
            float moveVertical = Input.GetAxis ("Vertical");
    
            Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
            GetComponent<Rigidbody>().velocity = movement * speed;
            
            //限制刚体在边界内移动
            GetComponent<Rigidbody>().position = new Vector3
            (
                Mathf.Clamp (GetComponent<Rigidbody>().position.x, boundary.xMin, boundary.xMax), 
                0.0f, 
                Mathf.Clamp (GetComponent<Rigidbody>().position.z, boundary.zMin, boundary.zMax)
            );
            
            //设置飞机在z轴的倾斜
            GetComponent<Rigidbody>().rotation = Quaternion.Euler (0.0f, 0.0f, GetComponent<Rigidbody>().velocity.x * -tilt);
        }
    }
    PlayerController
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 陨石随机移动
    /// </summary>
    public class Done_RandomRotator : MonoBehaviour 
    {
        /// <summary>
        /// 翻滚速度
        /// </summary>
        public float tumble;
        
        void Start ()
        {
            //设置陨石的角速度
            GetComponent<Rigidbody>().angularVelocity = Random.insideUnitSphere * tumble;
        }
    }
    RandomRotator
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 敌人的武器控制
    /// </summary>
    public class Done_WeaponController : MonoBehaviour
    {
        /// <summary>
        /// 子弹预设
        /// </summary>
        public GameObject shot;
        /// <summary>
        /// 发射子弹的位置
        /// </summary>
        public Transform shotSpawn;
        /// <summary>
        /// 发射子弹频率,
        /// </summary>
        public float fireRate;
        /// <summary>
        /// 发射子弹延迟
        /// </summary>
        public float delay;
    
        void Start ()
        {
            InvokeRepeating ("Fire", delay, fireRate);
        }
    
        void Fire ()
        {
            Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
            GetComponent<AudioSource>().Play();
        }
    }
    WeaponController

    游戏视频:https://pan.baidu.com/s/1o87Anwe

    游戏项目:https://pan.baidu.com/s/1c246OQs

  • 相关阅读:
    设计模式之策略模式
    assert断言——调试中不应该是syso
    Spring AOP
    MyBatis
    事务处理与使用连接池管理连接
    管理结果集(ResultSet)
    执行SQL语句的方式
    JDBC基础:
    NIO.2
    NIO
  • 原文地址:https://www.cnblogs.com/revoid/p/6431729.html
Copyright © 2011-2022 走看看