一、模拟水的阻力
潜水艇需要具备以下特点
1、对玩家操作不能快速做出反应
2、持续操作鼠标才能进行转弯
设计在水中的衰减率attenuate,潜艇进行转弯时除了自身要提供角加速度,同时角速度还会受到衰减率的影响,通过改变角加速度使潜艇速度缓慢变化。当玩家松开鼠标角速度因为衰减率的存在缓慢降低,实现潜艇反应慢,和鼠标持续操作进行转弯的特点。
[SerializeField] private float downAccelerate = 0.5f;//衰减加速度,玩家松手
private float attenuationTime = 0
private void FixedUpdate()
{
Angleattenu(Time.deltaTime);
if (Input.GetMouseButton(0))
{
attenuationTime = 0;
ChangeSpeed(Input.GetAxis("Mouse Y"));
ChangeAngle(Input.GetAxis("Mouse X"));
}
}
private void Angleattenu(float time)//角速度衰减
{
if(rotangle.y==0) return;
attenuationTime += time;
rotangle.y = Mathf.SmoothStep(startAttenu.y, 0.0f,attenuationTime / 5f);
controllor.transform.Rotate(Vector3.back * rotangle.y,Space.Self);
}
mathf.smoothstep在最小值与最大值之间进行t比例的差值,相比于mathf.lerp不同的是前者采用的是平滑曲线,后者是线性插值。
二、声呐系统
声呐系统分为两种模式:被动声呐和主动声呐
1.被动声呐
无法获得敌方的具体位置,只能通过声音判别大体位置。
通过对声呐设置球形碰撞体,让物体在进入球形碰撞体时得到反馈。并将导弹的方位显示在声呐中。
2.主动声呐
按住空格键后切换被动声呐为主动声呐,可以获得敌人和收集物资的具体方位。
使用主动声呐时敌人也更容易发现自己的位置从而发动攻击,通过对物体添加指定条件使得物体在进入声呐探索范围内显示具体位置。
使用预制体复制,不同声呐设置不同的光圈,通过mathf.smoothstep与mathf.lerp使光圈大小与光圈透明度成反比,即光圈越大透明度越大。
Object.Instantiate(obj, Vector3.zero, Quaternion.identity) as GameObject;
三、导弹系统
导弹爆炸冲击力
通过封装Explosion函数,当导弹爆炸时创建Explosion对象并为之设置参数。
public class Explosion
{
[SerializeField]
private float force = 100.0f; //爆炸力
[SerializeField]
private float upwardsModifier = 0.0f; //爆炸时向上的力
[SerializeField]
private ForceMode mode = ForceMode.Impulse; //作用力的方式
private float radius = 3.0f; //爆炸半径
public void Add(Rigidbody target, Vector3 pos)
{
target.AddExplosionForce(force, pos, radius, upwardsModifier, mode);
}
public void SetRadius(float value) { radius = value; }
};
Explosion explosion = new Explosion();
explosion.Add(,); //当物体碰撞时调用此函数即可添加爆炸冲击效果
四、敌人
进行简单的碰撞检测实现敌人的巡逻,当玩家caution达到100后敌人向玩家发射导弹。
detecter1 = new Ray(transform.position,transform.forward+transform.right);
detecter2 = new Ray(transform.position,transform.forward-transform.right);
if (Physics.Raycast(detecter1,out hit, 50f)||Physics.Raycast(detecter2,out hit,50f))
{
ChangeSped(Time.deltaTime,curSped,0,3);
ChangeAngle(Time.deltaTime,rotangle.y,MAXANGLESPED,2);
}
detecter1,detecter2分别是敌人的左探测射线和右探测射线(这里其实可以用到第六章的绘制扇形Mesh进行mesh探测,但是因为地图很简单,这里进行简略的探测碰撞)