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 ...
随机推荐
- SpringMVC 接受页面传递参数
一共是五种传参方式: 一:直接将请求参数名作为Controller中方法的形参 public String login (String username,String password) : 解 ...
- DevExpress WPF v18.2新版亮点(四)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress WPF v18.2的新功 ...
- ssm使用双数据源
工作中需要接入其他公司业务系统的数据进行分析,于是接入它们的db. 使用双数据源配置感觉如下: database.sessionFactory.扫描器.事务管理器等双份. 听说如果两个数据源需要一起使 ...
- 循环神经网络-Dropout
dropout 是 regularization 方法,在rnn中使用方法不同于cnn 对于rnn的部分不进行dropout,也就是说从t-1时候的状态传递到t时刻进行计算时,这个中间不进行memor ...
- java基础语法学习DayOne
一.关键字 1.概述:被java语言赋予特定含义的单词 2.特点:组成关键字的字母全部为小写 二.标识符 1.概述:给类.接口.方法.变量起名字时使用的字符序列 2.规则:只能使用英文大小写字母.数字 ...
- HTML5触摸事件(touchstart、touchmove和touchend)
HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事 ...
- libusb 终于搞好了
- anaconda jupyter notebook修改默认文件路径
使用anaconda附带的jupyter,想要改变默认运行文件路径,直接在cmd中输入jupyter notebook会提示:jupyter不是内部命令! 可能是anaconda代理了他所安装的软件, ...
- 对ajax中数据的得到以及绑定的认识
1.将后台得到的数据绑定到datagrid为例: 第一种是: 后台得到的数据直接绑定到datagrid上面,如下图: 这样操作的好处在于可以使界面比较简洁. 第二种是将得到的数据作为参数的形式绑定到d ...
- centos 安装thrift
Thrift介绍 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erl ...