先吐槽一下,windows 下找了一圈录屏软件,竟然没有一个好用的!最后没辙用的 斗鱼主播工具 录的下面视频。 哎 我又不是主播。。。
从 UnityStore 中导入资源
自 Unity 5 以后,标准资源包已经移动至 https://assetstore.unity.com/ 使用的话需从网页导入,而不再以前的这个
地方了。新版的需要在 https://assetstore.unity.com/ 输入搜索 Standard Assets
然后点击网页里的在unity 中打开。这样就会在 unity 界面出现这个网页,然后点击导入。
使用地形工具
首先导入地形对象
在这个界面中,先使用笔刷工具给导入的地形配上一张贴图
然后使用高度设定工具给地形设置一个默认高度, (地形高度最小为0 ,不设置默认高度的话无法降低地形) 点击 flatten 提升地面。
然后使用提升工具画出一条条群山。
再回到笔刷工具,我们添加第二张纹理,然后将部分地面刷成草地。
可以看出地面的一部分被刷成草地了。
然后使用smooth height 工具,在山头儿上刷几下,使其变得平滑。
下一步选择树木工具,为我们的地形上面画一些树木。
调整笔刷大小和密度,在场景中添加树木。
仔细调节场景,使其变得丰富起来。
添加第一人称控制器
Standard Assets 中已经为我们预制了第一人称控制器,我们将其拖转到场景中。 ps:先删除默认的摄像机
我们点击上方的 play 运行一下
W,A,S,D 可以控制人物的移动,我们的主角已经降临的场景中啦。
导入怪物资源
我们可以从 assetStore 中搜索 zombie 选取几款免费的资源当做备用。
将其导入至项目,然后将其的 “预制项” 拖入场景预览一下效果
还不错~。
我们要在僵尸头上放置一个血条,所以偷懒的我直接用 slide 组件了 :-)
然后在僵尸 zombie.cs 中声名 HP 属性 与 血条的 slide 组件引用:
public class Zombie : MonoBehaviour
{
public int HP;
public Slider slider;
}
为了使得僵尸一直看向主角,我们用 lookat 函数:
Vector3 newPos = new Vector3(
Camera.main.transform.position.x,
gameObject.transform.position.y,
Camera.main.transform.position.z
);
gameObject.transform.LookAt(newPos);
slider.value = HP;
射击判定
其实原理很简单,我们发射一条射线,如果在这条射线上碰撞到了任何物体,则产生碰撞回调:
RaycastHit hitInfo;
Transform pT = GetComponent<Transform>();
Ray ray = Camera.main.ScreenPointToRay(
new Vector(Screen.width / 2, Screen.height / 2, 0)
);
Physics.Raycast(ray, out hitInfo, 3000f);
if (hitInfo.collider.gameObject.tag == "zombie")
{
Zombie z = hitInfo.collider.gameObject.GetComponent<Zombie>();
z.hit(20);
GameObject b = Instantiate(blood);
b.transform.position = hitInfo.point;
b.transform.LookAt(gameObject.transform);
}
这样,碰撞信息会被储存在 hitInfo 中 hitInfo.collider.gameObject 就是碰撞到的物体。
这里我们要为僵尸设置碰撞体, Mesh Collision 虽然最逼真,但消耗太大,我们使用胶囊碰撞体。
这样可以稍稍兼顾性能与效果。
增加鲜血
我们先找到鲜血素材粒子效果,导入进项目
下面要做的是,当被击中后,将鲜血粒子附加到中弹的位置上。 上文中的 hitInfo.point 正是我们想要的。
GameObject b = Instantiate(blood); //创建鲜血粒子
b.transform.position = hitInfo.point; //将鲜血粒子移动至中弹位置
增加死亡动画
导入的僵尸素材是有动画,打开 animator control 我们可以找倒地的动画。有 idle fallingBack 等几个动画。
当僵尸的 HP 属性小于 0 时 我们播放 fallingback 动画。
void Update()
{
... ...
if (!isDead)
{
animator.Play(aniDead);
if (audioSourceRun.clip != audiodead)
{
audioSourceRun.clip = audiodead;
audioSourceRun.loop = false;
audioSourceRun.Play();
}
slider.gameObject.SetActive(false);
Invoke("remove", 2);
m.killed++;
m.killedText.text = "kill:" + m.killed.ToString();
}
isDead = true;
... ...
}
添加 3D 声音
3D 声音可以随着主角(listener) 与音源的距离变化,自动调节声道的音量,达到逼真的效果。
会发现我们的 FPSController 中的 FirstPersonCharacter 有一个 Listener 组件。
下面我们在僵尸上增加一个 Audio Source 组件。
这样,僵尸的声音就会随着与主角距离的变化而变化了。