【原文】http://unity3d.com/learn/tutorials/projects/survival-shooter
以下所有素材和代码来自官网。
步骤
1 简介
本练习能够帮助初学者更加深刻的了解到锁定视角的3D游戏制作流程,新增了射线相交检测、自动寻路、高级UI等内容。
2 搭建基本场景
- 加载整个游戏场景
- 添加地板
- 添加游戏背景音乐
3 添加游戏player
- 加载player模型
- 添加动画控制器
- 编写player的移动脚本(射线相交检测、跟踪旋转)
4 设置摄像机
- 移动摄像机到合适位置,设置好旋转角
- 编写摄像机跟随脚本(有移动延迟效果)
5 添加单个敌人
- 加载一个敌人角色到场景
- 添加敌人角色动画控制器
- 绑定碰撞体
- 烘焙场景导航网格
- 编写敌人的移动脚本使其跟随player
6 添加player血条GUI
- 添加canvas元素导场景(2D视角)
- 添加红心和血条slider
- 添加角色受伤遮罩图片(注意相对坐标)
7 设置player掉血逻辑
- 添加player掉血以及死亡音效
- 编写player掉血脚本
- 编写enemy攻击脚本
- 脚本间通信
8 攻击敌人
- 为player角色添加枪火粒子效果、射击线、音效、灯光效果
- 编写player的射击脚本
- 添加enemy角色的被射击效果、音效
- 编写enemy角色的掉血和死亡逻辑脚本
9 得分画面
- 添加得分GUI元素
- 编写分数管理器脚本(全局static类成员)
- 编写enemy掉血脚本中贡献分数的逻辑
- 移除单个敌人(为后面做准备)
10 批量产生敌人
- 场景中添加批量敌人产生管理器
- 编写敌人管理器脚本
11 Game Over画面
- 添加canvas里面多个元素的关键帧动画,构成game over的影片剪辑
- 为该影片剪辑设置动画控制器
- 编写脚本添加动画触发逻辑以及管卡重启逻辑
代码
有几段关键代码。
1 延迟动作
void FixedUpdate()
{
Vector3 targetCamPos=target.position+offset;
transform.position=Vector3.Lerp(transform.position,targetCamPos,smoothing*Time.deltaTime);
}
2 射线相交性检测
void Shoot ()
{
timer = 0f;
gunAudio.Play ();
gunLight.enabled = true;
gunParticles.Stop ();
gunParticles.Play ();
gunLine.enabled = true;
gunLine.SetPosition (0, transform.position);
shootRay.origin = transform.position;
shootRay.direction = transform.forward;
if(Physics.Raycast (shootRay, out shootHit, range, shootableMask))
{
EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> ();
if(enemyHealth != null)
{
enemyHealth.TakeDamage (damagePerShot, shootHit.point);
}
gunLine.SetPosition (1, shootHit.point);
}
else
{
gunLine.SetPosition (1, shootRay.origin + shootRay.direction * range);
}
}
3 导航网格辅助自动寻路
void Update ()
{
if(enemyHealth.currentHealth > 0 && playerHealth.currentHealth > 0)
{
nav.SetDestination (player.position);
}
else
{
nav.enabled=false;
}
}
4 实例化物体
void Spawn ()
{
if(playerHealth.currentHealth <= 0f)
{
return;
}
int spawnPointIndex = Random.Range (0, spawnPoints.Length);
Instantiate (enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation);
}