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 (, dodge) * -Mathf.Sign (transform.position.x);
            yield return new WaitForSeconds (Random.Range (maneuverTime.x, maneuverTime.y));
            targetManeuver = ;
            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 (, , 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 = ;
        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)
        {
            //生成敌人
            ; i < hazardCount; i++)
            {
                GameObject hazard = hazards [Random.Range (, 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

Space Shooter 学习的更多相关文章

  1. 源于《Unity官方实例教程 “Space Shooter”》思路分析及相应扩展

    教程来源于:Unity官方实例教程 Space Shooter(一)-(五)       http://www.jianshu.com/p/8cc3a2109d3b 一.经验总结 教程中步骤清晰,并且 ...

  2. jspace2d——A free 2d multiplayer space shooter

    http://code.google.com/p/jspace2d/ —————————————————————————————————————————————————————————————— We ...

  3. Space Shooter

    项目:https://pan.baidu.com/s/1jIDe2H4 using UnityEngine; using System.Collections; namespace VoidGame ...

  4. Survival Shooter 学习

    using UnityEngine; using System.Collections; namespace CompleteProject { /// <summary> /// 摄像机 ...

  5. Space Shooter 太空射击

    1.控制玩家移动 public float speed = 10f; public float xMin = -6.5f; public float xMax = 6.5f; public float ...

  6. Unity 官方自带的例子笔记 - Space Shooter

    首先 买过一本叫 Unity3D开发的书,开篇第一个例子就是大家经常碰见的打飞机的例子,写完后我觉得不好玩.后来买了一本 Unity 官方例子说明的书,第一个例子也是打飞机,但是写完后发现蛮酷的,首先 ...

  7. unity官方案例精讲(第三章)--星际航行游戏Space Shooter

    案例中实现的功能包括: (1)键盘控制飞船的移动: (2)发射子弹射击目标 (3)随机生成大量障碍物 (4)计分 (5)实现游戏对象的生命周期管理 导入的工程包中,包含着一个完整的 _scene--- ...

  8. 非常优秀的iphone学习文章总结!

    This site contains a ton of fun tutorials – so many that they were becoming hard to find! So I put t ...

  9. Unity3d学习日记(二)

      跟着教程做让背景可以滚动起来并添加了背景的粒子特效,加入了敌机.   ctrl攻击,↑↓←→移动,Game Over后按R重新开始游戏.   Space Shooter游戏地址:http://ya ...

随机推荐

  1. Android : 输入设备键值从底层到应用层的映射流程

    一.Android输入子系统简介: Android输入事件的源头是位于/dev/input/下的设备节点,而输入系统的终点是由WMS管理的某个窗口.最初的输入事件为内核生成的原始事件,而最终交付给窗口 ...

  2. linux 创建安装redis服务

    1.找下redis的官方的下载地址:http://download.redis.io/releases/redis-3.2.8.tar.gz  有最新的就下载最新 先下载解压跟安装 wget http ...

  3. 6.3 C++修改字符串

    参考:http://www.weixueyuan.net/view/6392.html 总结: string字符串同样可以像字符串数组那样按照下标逐一访问字符串中的每一个字符,string字符串的起始 ...

  4. DevExpress v18.1新版亮点——Analytics Dashboard篇(二)

    用户界面套包DevExpress v18.1日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Analytics Dashboard v18.1 的新功能,快 ...

  5. angular2架构详解

    参考  http://codin.im/2016/09/18/angular2-architecture-intro/ http://www.tuicool.com/articles/EvEZjmZ ...

  6. jvm内存配置参数

    请看下面题目: 对于jvm内存配置参数: -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3 其最小内存值和Survior区总大小分别是: a. 51 ...

  7. MySQL:存储过程和函数

    存储过程和函数 一.创建存储过程和函数 1.创建存储过程 语法: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic . ...

  8. 2-log4j2之使用根控制器输出日志到控制台

    一.添加maven依赖 <!-- 使用aliyun镜像 --> <repositories> <repository> <id>aliyun</i ...

  9. python 26个技巧

    26个你不知道的Python技巧   Python是目前世界上最流行的编程语言之一.因为: 1.它容易学习 2.它用途超广 3.它有非常多的开源支持(大量的模块和库) 不好意思,优达菌又啰嗦了. 本文 ...

  10. python中的pandas的两种基本使用

    python中的pandas的两种基本使用2018年05月19日 16:03:36 木子柒努力成长 阅读数:480 一.pandas简介 pandas:panel data analysis(面板数据 ...