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. netty源码理解补充 之 DefaultChannelPipeline到底是个啥

  2. Java语法基础DayFive

    一.继承 1.格式:class 子类 extends 父类 2.好处:提高代码的复用性:让类与类之间产生了关系,是多态的前提. 3.弊端: (1)类的耦合性增强了,而开发的原则是高内聚,低耦合.内聚是 ...

  3. day 60 pyMySQL 的安装及其 增删改查的应用

    一 pyMySQL 的安装 1 在pyCharm 中安装pyMySQL 这个模块取决能否顺利链接到MySQL  2 可以在 cod 中 添加 pip install  pyMySQL 3 在cmd 中 ...

  4. vim3

    使用vim编辑多个文件 编辑多个文件有两种形式,一种是在进入vim前使用的参数就是多个文件.另一种是在进入vim后再编辑其他文件. 1. vim 1.txt 2.txt 在命令行模式下输入:n编辑2. ...

  5. [转]Cross-type joins in Elasticsearch

    Cross-type joins in Elasticsearch http://rore.im/posts/elasticsearch-joins December 31, 2014 When mo ...

  6. dubbo AdaptiveExtension

    AdaptiveExtension 自适应Extension,作者其实在使用Extension方和Extension之间插入AdaptiveExtension用来自适应,也可以说是适配. 所以,我们发 ...

  7. 九度OJ-1001-A+B矩阵-有些小技巧

    题目1001:A+B for Matrices 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:22974 解决:9099 题目描述: This time, you are supposed ...

  8. C#Lambda表达式详解

    Lambda表达式教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创 ...

  9. ZOJ - 4082:Little Sub and his Geometry Problem (双指针)

    Little Sub loves math very much, and has just come up with an interesting problem when he is working ...

  10. 获取div,表单中的内容

    获得内容 - text().html() 以及 val() 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元 ...