unity官方教程Space Shooter 学习笔记

我觉得这个教程对我最大的启发就是其中的一句话, 子物体是贴图,父物体是属性。所以我们在创建物体前最好先建立一个空的gameobject,

这样既可以保持hierarchy面板整洁便于管理,又能实现刚才说的话。好了, 下面步入正题。

如何创建一个子弹?

我们先创建一个平面,然后将子弹的贴图赋给这个平面,然后再将shader选项选中mobile的particles的additive,这样就只有激光那部分可以显示出来,

黑色部分就会小时,最后在给子弹添加rigidbody组件和capsule Collider组件,这样子弹就完成了。

如何让子弹前进?

直接在子弹z轴方向给一个初速度就好了

using UnityEngine;
using System.Collections;

public class BoltMove : MonoBehaviour {
	public float speed;
	// Use this for initialization
	void Start () {
		rigidbody.velocity = transform.forward * speed;
	}
}

如何让子弹按一定频率发射?

void Update(){
		//在固定的时间段生成一个物体
		if (Time.time > nextFire) {
			nextFire = Time.time + fireRate;
			Instantiate (shot, shotSpawn.position, shotSpawn.rotation);
		}
	}

shotSpwan.position是飞船的位置,fireRate就是我们想要的频率

如何将飞船的移动限制在一定范围?

这里我们需要用到一个函数mathf中的Clamp

using UnityEngine;
using System.Collections;
[System.Serializable]
public class Limit{
	public float xMax,xMin,zMax,zMin;
}
public class PlayrControl : MonoBehaviour {
	public float speed;
	public Limit limit;
	public float tilt;
	public GameObject shot;
	public Transform shotSpawn;

	void FixedUpdate(){
		float x = Input.GetAxis ("Horizontal");
		float y = Input.GetAxis ("Vertical");
		Vector3 movement = new Vector3 (x, 0.0f, y);
		rigidbody.velocity = movement * speed;
		rigidbody.position = new Vector3
		(
			Mathf.Clamp(rigidbody.position.x, limit.xMin, limit.xMax),
			0.0f,
			Mathf.Clamp(rigidbody.position.z, limit.zMin, limit.zMax)
		);
		rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);
	}
}

当子弹和陨石飞出边界时如何销毁?

这里我们需要一个大的Cube将我们游戏场景围起来,然后给Cube添加一个Box Collider组件,然后检测如果有物体离开触发器,销毁就好了

void OnTriggerExit(Collider other) {
		Destroy(other.gameObject);
	}

子弹与陨石碰撞或者飞船与陨石碰撞,如何同时销毁且产生爆炸效果?

void OnTriggerEnter(Collider other) {
		if (other.tag == "Boundary")
			return;
		hard++;
		if (hard == 2) {
			Instantiate (explosion, other.transform.position, other.transform.rotation);
			Destroy (gameObject);
			gameControl.AddScore(scoreValue);
		}
		if (other.tag == "Player") {
			Instantiate (player_explosion, other.transform.position, other.transform.rotation);
			Destroy (gameObject);
			gameControl.gameOver = true;
		}
		//Debug.Log (other.name);
			Destroy(other.gameObject);
	}

我解释一下,

if (other.tag == "Boundary")

因为这个函数是当进入触发器时执行,但是我们的陨石一直在Cube的触发器中, 所以我们要排除Cube的干扰

Instantiate (explosion, other.transform.position, other.transform.rotation);

这句话就是在子弹当前位置产生一个爆炸效果物体

如何一波一波的生成敌人?

void Start(){
		StartCoroutine(SpawnWaves ());
	}
	IEnumerator SpawnWaves(){
		while (true) {
			yield return new WaitForSeconds (startWait);
			for (int i = 0; i < hazardCount; i++) {
				Vector3 spawnPositoin = new Vector3 (Random.Range (-spawnValues.x - 3, spawnValues.x - 3), 0, spawnValues.z);
				Quaternion spawnRotation = Quaternion.identity;
				Instantiate (hazard, spawnPositoin, spawnRotation);
				yield return new WaitForSeconds (spawnWait);
			}
		}
	}
时间: 2024-12-12 08:24:54

unity官方教程Space Shooter 学习笔记的相关文章

蓝鸥Unity开发基础——If 语句学习笔记

蓝鸥Unity开发基础--If 语句学习笔记 本节内容:程序的三种结构,if语句,问号表达式 程序的三种结构 顺序结构:顺序执行语句 分支结构:通过进行判断,在多个语句块中选择某一个执行 循环结构:条件满足时,反复执行同一语句块 If语句 用if语句可以构成分支结构 它根据给定的条件进行判定,用来决定要执行某个程序段 一.if(条件表达式){语句1} using System; namespace Lesson11{    class MainClass    {        public s

蓝鸥Unity开发基础—— 一维数组学习笔记

蓝鸥Unity开发基础-- 一维数组学习笔记 一.数组 之前我们学过很多数据类型,今天我们来学习数字,数字也是一种数据类型,那么,具体的数组是如何定义的? 数组:相同数据类型的成员组成的一组数据 Int类型数组:4  7  12  3  5--数组元素 Float数据类型数字:11.5 4.62 7.1 2.21 9.3--数组元素 数组中每一个元素都会分配一个数组下标,数组下标是从0开始的,有序排列,如:0 1 2 3 4 二.声明并初始化数组: 数组也是数据类型,所以也可以声明变量.使用ne

Unity 官方教程 学习

Interface & Essentials Using the Unity Interface 1.Interface Overview https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/interface-overview?playlist=17090 2.The Scene View https://unity3d.com/cn/learn/tutorials/topics/interface-essent

马哥LINUX高薪LINUX高薪就业入门教程-虚拟机篇幅-学习笔记-11

课程名称:马哥Linux高薪就业入门-安装学习VMware Workstation9-1 课程主要内容:虚拟机安装及OS系统配置说明 虚拟机硬件配置: CPU,Memory,I/O(disk,Ethercard) 虚拟机关键字: 1.disk image file(磁盘映像文件) 2.Sparse(稀疏格式) 3.CPU超线程 虚拟机使用技巧: 1.虚拟机磁盘建议放置空间大,分区编号越小性能越好,对于不常用的文件就放到最外层的: 2.CPU一级缓存最高,二级缓存价格次之,一级缓存容量翻倍基本价格

蓝鸥Unity开发基础——For语句学习笔记

一.For循环语句 For循环语句一般用于循环次数已知的情况 For(初始化:循环条件:循环增量){ 循环体--} 举例说明: using System; namespace Lesson14{    class MainClass    {        public static void Main (string[] args)        {            //for(初始化表达式:循环条件表达式:循环增量表达式){循环体} //循环100次            int nu

蓝鸥Unity开发基础——使用字符串学习笔记

蓝鸥Unity开发基础使用字符串 本节内容:使用字符串:字符串拼接.转义字符 一.字符串拼接:字符串可以使用+或+=进行字符串拼接!! 二.转移字符--举例\n(表示回车.换行) 转移字符 转义_转义意义 \n_表示换行或回车 \t_表示制表符 \"_表示双引号 \'_表示单引号 \\_表示反斜杠 在字符串前面加@符号,会使字符串的转义字符失效! 字符串中转义字符失效之后,我们需要使用两个双引号来打印双引号 源代码 using System; namespace Lesson08{    cla

蓝鸥Unity开发基础——Switch语句学习笔记

一.Switch语法 属于多分支语句,通过判断表达式的值,来决定执行哪个分支 Break用于结束某个case,然后执行switch之外的语句 Switch-开关:case-情况开关决定发生的情况 二.Switch基本语法 Switch(表达式){ Case 值1: 语句1 Break: Case 值2: 语句2 Break: -- Case 值n: 语句n Break: Default: 语句 Break: } 三.注意事项 整个defaul语句都可以舍掉,default语句最多只能由一个 Sw

蓝鸥Unity开发基础——控制台输入输出学习笔记

控制台输入输出:本节内容控制台输入输出.格式化输出 using System; namespace Lesson09{    class MainClass    {        public static void Main (string[] args)        {            /* 控制台输出语句             * 1.Console.WriteLine("");             * 2.Console.Write (" "

&amp;lt;&amp;lt;Python基础教程&amp;gt;&amp;gt;学习笔记 | 第12章 | 图形用户界面

Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ 丰富的平台: Tkinter实际上类似于标准,由于它被用于大多数正式的Python GUI程序.并且它是Windows二进制公布版的一部分. 可是在UNIX上要自己编译安装. 还有一个越来越受欢迎的工具是wxPython. 这是个成熟并且特性丰富的包,也是Python之父,Guido van Ro