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 ...
随机推荐
- 4.5 C++重载、覆盖和遮蔽
参考:http://www.weixueyuan.net/view/6375.html 总结: 函数签名包括函数名和函数参数的个数.顺序以及参数数据类型. 需要注意的是函数签名并不包含函数返回值部分, ...
- SQL-1 选取表中某一属性最大值的所有信息 查找最晚入职员工的所有信息
题目描述 查找最晚入职员工的所有信息CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`fi ...
- 一个在linxu自动切换ip的脚本
最近的爬虫是在linux下运行的,使用的是云立方的代理服务器,需要自动切换一下ip. #!/bin/bash# coding:utf8 aa="sources.list" #主流程 ...
- 4.Python爬虫入门四之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- 《uniGUI for cBuilder入门到精通》新书预定
<uniGUI for cBuilder入门到精通>火热预定中,从零开始带你入瓮带你飞,手把手教你如何快速安装,开发和部署一个web系统,前十名用户售价暂定100元,后续价格每本200元, ...
- 制作Wi-Fi Ducky远程HID攻击设备
1.介绍WIFI DUCKY 它是一个Wi-Fi控制的BadUSB设备来远程执行Ducky Scripts. 使用充当键盘的USB设备来注入攻击,Hak5 的 USB Rubber Ducky 是这种 ...
- dict的items()方法于iteritems()方法的不同
items方法将所有的字典以列表方式返回,其中项在返回时没有特殊的顺序: iteritems方法有相似的作用,但是返回一个迭代器对象.
- DRBD常用管理篇
在DRBD进入使用阶段之后,要经常查看它的工作状态,通过这些状态来判断DRBD运行情况. 1) 使用drbd-overview命令观察状态 最为简便的方式就是运行drbd-ove ...
- shell 批量计算MD5值
#!/bin/sh #需要计算MD5文件列表 # list=`ls` list="file list" for file in $list do file1=`` echo &qu ...
- OpenVPN多用户配置
/********************************************************************************* * OpenVPN多用户配置 * ...