Unity笔记 SPACE SHOOTER 实例详解

第一部分 准备资源
介绍
一个完整小项目,2D玩法3D资源。
http://unity3d.com/learn/tutorials/projects/space-shooter-tutorial
本文主要是一些tips。

1 建立项目
关于编辑器布局(layout):
可以随自己喜欢改变和存储当前layout。

2 建立玩家飞船GameObject
Player:
加入一个飞船模型的GameObject,添加一些组件:mesh filter来包含mesh、mesh render来渲染、有2个材质、transform来决定位置。
加入rigidbody用来控制player,取消重力影响。
capsule collider(胶囊碰撞体,就是两个球体及其之间的部分)。
加入简单mesh做为碰撞检测用物体,这样可以提高效率。
添加粒子子物体,用于飞船尾部喷火。
gizmo(图示)太大了如果影响显示,可以缩小显示。

3 摄像机和光
点击transform齿轮图标有个reset可以重置camera的值为初始。
在没有光的情况下仍然可以看到飞船,是因为有Ambient light(环境光),在RenderSettings中可以设成black则可以认为是关掉了环境光。
很实用的一个打光方式“3 light system“:
都是平行光,main light(主光)、fill light(补光)、rim light(轮廓光)。
fill light 从main light复制得到,改变颜色和intensity(强度)都是0.5。
rim light 逆光,白色,强度0.25,目的是加强轮廓。
使用空的GameObject来容纳3个light,用这种方式来整理场景。

4 背景
建立一个背景GameObject:
添加一个quad(Mesh filter)组件,拖拽一个纹理unity会自动生成一个材质。
看起来灰暗,所以要换个shader:
diffuse shader,看起来亚光(mutt)不是光滑(glossy paint,specular shader),并且收到场景3 light system影响。
此处最后选择了unlit shader,不受光影响的shader。

5 移动玩家飞船
移动:
rigidbody.velocity = movement * speed;
打开script帮助文档:
Ctrl+’ 会打开一个浏览器指向本地帮助文档。
数学库:
Mathf.Clamp的使用,clamp限制一个值的范围。
Serializable来开放一个class给unity编辑器:
在class前面加上[System.Serializable]就可以在inspector中看的了。

[System.Serializable]
public class Boundary
{
    public float xMin, xMax, zMin, zMax;
}   

tilt(倾斜)使用eular(欧拉角)构造四元数:
rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);

6 子弹prefab
prefab(预制),建立一个prefab以后就可以直接实例化gameobject了。
渲染激光:
选择particle-> additive shader,+0(黑色)无效果所以使用的资源透明处为黑色。
碰撞:
碰撞体在父,渲染资源在子。
移除quad的碰撞片,在父物体上添加碰撞胶囊和rigidbody。
移动子弹:
rigidbody.velocity = transform.forward * speed;

7 发射子弹
发射位置:
添加一个shot spawn的子物体,用于决定子弹发射位置。
追踪实例化prefab结果:
GameObject clone = Instantiate(shot, shotSpawn.position, shotSpawn.rotation) as GameObject;
一定时间间隔发射:

if (Input.GetButton("Fire1") && Time.time > nextFire)
{
    nextFire = Time.time + fireRate;
    Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
}

第二部分 游戏逻辑
1 边界
子弹如何销毁:
建立cube,改成trigger。用OnTriggerExit只使用一个cube即可。
void OnTriggerExit(Collider other)
{
Destroy(other.gameObject);
}
游戏屏幕从上到下的大小是orthorgraphic(正交) size的2倍。

2 hazard
陨石和子弹类似,碰撞体在父,渲染资源在子。
shift按住可以编辑器里方便的调整胶囊大小。
随机方向翻跟头(tumbling):

void Start ()
    {
        rigidbody.angularVelocity = Random.insideUnitSphere * tumble; 
    }

杀伤力,使用tag来标识特定的gameobject,避免和boundary作用destory:
void OnTriggerEnter(Collider other)
{
if (other.tag == “Boundary”)
{
return;
}
Destroy(other.gameObject);
Destroy(gameObject);
}

3 爆炸
播放一个爆炸的Prefab:
Instantiate(explosion, transform.position, transform.rotation);
设置玩家tag为player。

4 GameController
Random.Range随机出一个范围里的数。

5 生成波
coroutine的使用。
explosion按照时间销毁:
void Start ()
{
Destroy (gameObject, lifetime);
}

第3部分 完成
1 声音
声音相关3个东西audio clips, audio source, audio listener。
在clip import选项里有3D的会根据listener和source来实现3D功能,这个项目没有用到所以不用设置。
自动播放:
直接拖clip到prefab这个clip在awake时会自动播放。
手动播放:
把play on awake去掉,在代码中调用audio.Play()。

2 分数
得到脚本调用其中方法:
GameObject gameControllerObject = GameObject.FindWithTag (“GameController”);
if (gameControllerObject != null)
{
gameController = gameControllerObject.GetComponent ();
}
// 调用
gameController.AddScore (scoreValue);

3 结束游戏
重新开始scene:
if (Input.GetKeyDown (KeyCode.R))
{
Application.LoadLevel (Application.loadedLevel);
}

4 build
Web方式发布。

你可能感兴趣的:(unity)