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 ...
随机推荐
- nopcommerce 4.1 net core 学习1
关注nop有2年多, 基本都是下载看看结构, 里面的多语言跟主题模板 插件加载 是我比较喜欢的. 最近看nop4.1版本已经全面替换成了asp.net core 2.1 +ef core2.1,所以专 ...
- table-cell 布局
table-cell能实现段落文字相对于div的垂直居中: 将div设置为display:table-cell; *display:inline-block;text-align:center; ve ...
- oracle用户下查看服务器或者本地IP地址
1.查看oracle所在服务器的ip: select utl_inaddr.get_host_address from dual; 2.查看登陆oracle机器的IP: select sys_cont ...
- Final阶段第1周/共1周 Scrum立会报告+燃尽图 06
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2485] 版本控制:https://git.coding.net/liuyy08 ...
- pytest启动浏览器,失败用例截图
1.conftest.py # coding:utf- from selenium import webdriver import pytest driver = None @pytest.mark. ...
- scrapy--分布式爬虫
14.3 使用scrapy-redis进行分布式爬取了解了scrapy-redis的原理后,我们学习使用scrapy + scrapyredis进行分布式爬取.14.3.1 搭建环境首先搭建scrap ...
- 2019-03-14-day010-函数进阶
昨日回顾 1.函数: 函数的定义 函数的参数 位置参数 关键字参数 混合参数 形参的位置上(默认参数) 实参的位置上(关键字参数) 位置参数 > 默认参数 三元运算符: c = a if a&g ...
- 更换Homebrew为中科大源
官网:https://brew.sh/index_zh-cn /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com ...
- 使用lets encrypt获取免费ssl证书
lets encrypt也是一个CA,并且在众多大厂的加持下有可能成为最棒的免费颁发证书的CA,尤其是chrome的加入. 目前https已经成为了一种趋势,无奈证书授权费用相当昂贵,将一大批企业挡在 ...
- HDU 6124 17多校7 Euler theorem(简单思维题)
Problem Description HazelFan is given two positive integers a,b, and he wants to calculate amodb. Bu ...