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. powershell玩转litedb数据库-第二版

    powershell可以玩nosql数据库吗?答案是肯定的.只要这个数据库兼容.net,就可以很容易地被powershell使用. 发文初衷:世界上几乎没有讲powershell调用nosql的帖子, ...

  2. mybatis动态sql #和$的区别

    $和#都支持动态sql:就是你传什么它就是什么 区别: 1.#可以防止sql注入在sql执行时显示 '?' 比$安全 SELECT * FROM table WHERE id = ? 2.在使用#传入 ...

  3. SDK Manager的使用

    前言:SDK Manager就是一个Android软件开发工具包管理器,就像一个桥梁,连通本地和服务器,从服务器下载安卓开发所需工具到本地. 1.在android sdk 安装目录下,有一个SDK M ...

  4. L266 作文

     With the rapid development of modem society, an increasing number of people are concerned about the ...

  5. SpringMVC实现从磁盘中下载文件

    除了文件的上传我们还需要从磁盘下载 实现文件的下载只要编写一个控制器,完成读写操作和响应头和数据类型的设置就可以了 下面演示的是从G盘imgs文件夹中下载文件 具体代码如下 package com.c ...

  6. Vue数组操作不刷新视图问题的解决

    最近使用Vue2.0开发项目,有一个列表使用v-for绑定到数组,按照Vue的推荐方案,使用push.splice.this.$set三个变异方法操作数组.发现在添加页面,三个方法都能及时刷新视图:但 ...

  7. MYSQL MyISAM与InnoDB对比

    1. 区别: (1)事务处理: MyISAM是非事务安全型的,而InnoDB是事务安全型的(支持事务处理等高级处理): (2)锁机制不同: MyISAM是表级锁,而InnoDB是行级锁: (3)sel ...

  8. C# EditPlus环境设置

    C# EditPlus环境设置 先要设置环境变量   5.0的 C:\Program Files\MSBuild\12.0\Bin 6.0的  C:\Windows\Microsoft.NET\Fra ...

  9. API/SPI可扩展设计原则(转)

    API/SPI可扩展设计原则 博客分类: [设计体系]架构模式 API/SPISPISPI原则JAVA SPISPI机制  写本篇主要是用来后面写一篇可扩展性软件设计打好基础(苦于找不到一篇关于API ...

  10. PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)

    前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...