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 (, 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 学习的更多相关文章
- 源于《Unity官方实例教程 “Space Shooter”》思路分析及相应扩展
教程来源于:Unity官方实例教程 Space Shooter(一)-(五) http://www.jianshu.com/p/8cc3a2109d3b 一.经验总结 教程中步骤清晰,并且 ...
- jspace2d——A free 2d multiplayer space shooter
http://code.google.com/p/jspace2d/ —————————————————————————————————————————————————————————————— We ...
- Space Shooter
项目:https://pan.baidu.com/s/1jIDe2H4 using UnityEngine; using System.Collections; namespace VoidGame ...
- Survival Shooter 学习
using UnityEngine; using System.Collections; namespace CompleteProject { /// <summary> /// 摄像机 ...
- Space Shooter 太空射击
1.控制玩家移动 public float speed = 10f; public float xMin = -6.5f; public float xMax = 6.5f; public float ...
- Unity 官方自带的例子笔记 - Space Shooter
首先 买过一本叫 Unity3D开发的书,开篇第一个例子就是大家经常碰见的打飞机的例子,写完后我觉得不好玩.后来买了一本 Unity 官方例子说明的书,第一个例子也是打飞机,但是写完后发现蛮酷的,首先 ...
- unity官方案例精讲(第三章)--星际航行游戏Space Shooter
案例中实现的功能包括: (1)键盘控制飞船的移动: (2)发射子弹射击目标 (3)随机生成大量障碍物 (4)计分 (5)实现游戏对象的生命周期管理 导入的工程包中,包含着一个完整的 _scene--- ...
- 非常优秀的iphone学习文章总结!
This site contains a ton of fun tutorials – so many that they were becoming hard to find! So I put t ...
- Unity3d学习日记(二)
跟着教程做让背景可以滚动起来并添加了背景的粒子特效,加入了敌机. ctrl攻击,↑↓←→移动,Game Over后按R重新开始游戏. Space Shooter游戏地址:http://ya ...
随机推荐
- TLS反调试
0x01 TLS反调试简介 TLS(Thread Local Storage)原本的目的是解决多线程程序中变量同步的问题.线程本身有独立于其他线程的栈空间,因此线程中的局部变量不用考虑同步问题.多线程 ...
- ubuntu安装nodejs,npm live-server
sudo apt-get install curl 先安装的是curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/in ...
- http协议tcp协议ip协议三次握手四次挥手,为什么三次握手,为什么四次挥手,sockete套接字理解
1.1 TCP是什么? TCP是Tranfer Control Protocol的简称,TCP协议是一种面向连接的.可靠的.基于字节流的运输层通信协议.通过TCP协议传输,得到的是一个顺序的无差错的数 ...
- Day7作业及默写
1. 判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方的和还等于这个数. 那这个数就是一个水仙花数. 例如: 153 = 1**3 + 5**3 + 3**3 InputNu ...
- web-view中下载微信头像跨域解决方案
let img = new Image() // 头像地址后边添加时间戳可解决跨域问题 555. img.src = 'http://wx.qlogo.cn/mmopen/vi_32/RnLIHfXi ...
- 1.Windows下使用VisualSVN Server搭建SVN服务器
使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和Apache相配合来实现源代码的 SVN管理简单的多,下面就看看详细的说明. VisualSVN Server的 ...
- 【Python】多进程-共享变量(Value、string、list、Array、dict)
#练习:未使用共享变量 from multiprocessing import Process def f(n, a): n = 3.1415927 for i in range(len(a)): a ...
- Jsoup的学习
一 . 什么是jsoup jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来 ...
- Mac 终端添加代码到SVN
从SVN拉取代码步骤: 1.cd /Users/mark/zkh/Work/BC/(本地路径) 2.svn checkout https://192.168.2.99/svn/bc_android ...
- ecshop常见sql注入修复(转)
ecshop系统部署在阿里云服务器上,阿里云提示Web-CMS漏洞: 修复方法如下: 0. /good.php 大概在第80行 $goods_id = $_REQUEST['id']; 修改为 $go ...