第四章 DarkWater

这篇博客介绍了潜水艇模拟中的水阻设计,通过角速度衰减实现潜艇缓慢反应和持续操作转弯。同时,详细阐述了声呐系统的被动和主动模式,以及如何通过碰撞检测反馈敌人位置。此外,还涵盖了导弹系统的爆炸冲击力实现,并展示了敌人如何通过简单的碰撞检测进行巡逻和导弹发射。
摘要由CSDN通过智能技术生成

一、模拟水的阻力

潜水艇需要具备以下特点

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探测,但是因为地图很简单,这里进行简略的探测碰撞)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值