愉悦的寒假生活总是会猝不及防地迎来尾声,这也意味着我大一生活的进度条已经过半了。幸运的是,在我某位优秀的学长的带领下,我完整地开发出来了unity的官方案例噩梦射手并基本实现所有功能,也是让我这个大一的苟蒻积攒了不少的新知识。话不多说进入正题。
整个开发总结大体上我会分为这几几部分来写,分别是:游戏角色,怪物,gameManager,音效以及UI,可能会有所改动。
本篇就来讲解一下游戏中主角的功能实现以及脚本书写。
我们将下载好的资源包导入到unity工程中,由于案例太老,官方已经取消了该资源包的下载。下载途径是我在网上随便找i的。
https://pan.baidu.com/s/1bBUyYZArcL7HKnf1Hj2V0A 提取码: dk9y
所有的模型都是已经准备好了的,我们只需要利用组件以及脚本实现功能即可。对于主角,我们首先需要实现的功能有这几个:行走,攻击,受伤害时表现,死亡时表现.这些是最基本的东西,接下来我们来处理这些事。
对于角色的行走,老生常谈的事情了,再控制好相机的跟随,分别创建两个脚本playermovement跟cameraFollow来实现,这里的话我也就不再多讲,直接会在后面贴代码了。毕竟这些博客我的想法是重在整理新知识。值得一提的是,我在输入时利用的都是我学长自己开发的组件,所以有些地方可能会造成困惑。
而攻击功能呢,我们需要检测鼠标i的点击来控制角色是否开枪,同时还需要让我们的枪口,也就是我们的开枪的方向,要始终朝向我们鼠标所在的方向,这是功能需求。
这里我们首先需要预制一个游戏物体,作为我们开枪时发生出去的子弹,单独为其创建一个脚本叫做Bullet,来配置子弹的参数。具体代码如下:
public class Bullet : MonoBehaviour
{public int damage = 10; //子弹伤害public float flySpeed = 100f; //飞行速度public float duration = 5f; //子弹存在时间private Vector3 dir = Vector3.zero; //飞行方向private bool isFire = false;public void Fire(Vector3 dir){this.dir = dir; //确认方向isFire = true;Destroy(gameObject, duration); //到时自动销毁}private void Update(){if (!isFire)return;transform.Translate(flySpeed * dir * Time.deltaTime); //子弹的飞行} private void OnTriggerEnter(Collider other) //触发检测{EnemyBase enemy = null;if( other.TryGetComponent<EnemyBase>(out enemy)){enemy.GetDamage(damage); //对怪物造成伤害}Destroy(gameObject); //碰到怪物销毁子弹}
}
子弹预制体的inspector页面如下:
开枪功能的是实现,我们将其单独定义为一个脚本,叫做shoot,首先我们不应该将鼠标点击的检测设置为单次检测,很傻,体验感也很差,比较好的做法是在检测鼠标点击时采用连续检测,然后手动设置一个子弹生成速率,来控制我们在按下鼠标时子弹的发射频率。具体代码如下:
ublic class Shoot : MonoBehaviour
{public float rate = .2f; //子弹生成速率public GameObject bulletPrefab; //子弹预制体public Transform gunport; //获取枪口的位置public AudioClip shootFx; //音效(后面再说)private float timer = 0; //计时器void Start(){timer = rate; //在开始时先让计时器等于我们的速率,第一次按下直接发射子弹。}void Update(){if(PlayerInput .Instance .Shoot && timer >=rate) //条件:判断到鼠标连续到鼠标连续点击并且计时器小于生成速率{GameObject bullet = Instantiate(bulletPrefab, gunport.position, Quaternion.identity); //实例化子弹bullet.GetComponent<Bullet>().Fire(gunport.forward); //调用子弹发射函数timer = 0; //计时器归0AudioManager.Instance.PlayFx(shootFx, gunport.position); //音效}timer += Time.deltaTime; //计时}
}
值得注意的是在上面两个脚本中,有用到的unity几个自带的函数方法。
1. Destroy()函数:static void Destroy(Object obj, float t = 0.0F);
第一个参数是传入销毁物体,第二个参数是传入执行时间,没有该参数就是立刻销毁。
2.Transform.Translate()函数:
可传入两个参数,第一个是移动速度,这个速度既包含大小,也包含方向,是一个矢量,第二个参数是相对坐标系。详情可以移步这篇博客:http://t.csdn.cn/mipiC
3.Instantiate()函数:
实例化函数,也叫做克隆函数,具体可参考:http://t.csdn.cn/b5bAm
至此,我们角色的攻击的功能也就实现啦。脚本中包含的其他功能会在后面的博客再详细记录,大家如果有问题,也可以在评论区留言或者私信我,俺也是很热心的一个博主啦,那今天就先写到这吧,886~