捕鱼子弹在屏幕内移动反弹

1.确认屏幕的边界 看之前博客链接点击

2.控制子弹移动 移动到边界 反弹

/// <summary>
/// 子弹控制器
/// </summary>
public class SingleBullet : MonoBehaviour
{
    
    
    private Transform curTrans;
    /// <summary>
    /// 子弹速度
    /// </summary>
    public float speed = 6;
    /// <summary>
    /// 左,上,右,下的边界.
    /// </summary>
    private Vector4 viewportRect;
    /// <summary>
    /// 当前移动的方向
    /// </summary>
    private enum dir
    {
    
    
        none = 0,
        left,
        up,
        right,
        down
    }
    /// <summary>
    /// 子弹当前朝向
    /// </summary>
    private dir curDir = dir.none;
    /// <summary>
    /// 子弹所锁定的鱼
    /// </summary>
    private SingleFish lockSingleFish;

    private void Awake()
    {
    
    
        curTrans = this.transform;
        viewportRect = AppFacade.Instance.GetManager<PanelManager>(ManagerName.Panel).GetCameraViewport();
    }

    private void OnEnable()
    {
    
    
        //重置数据
        lockSingleFish = null;
        curDir = dir.none;
    }

    /// <summary>
    /// 子弹初始化
    /// </summary>
    private void BulletInit(Transform lockeFish)
    {
    
    
        if (lockeFish != null)
            this.lockSingleFish = lockeFish.GetComponent<SingleFish>();
    }

    private void Update()
    {
    
    
        UpdateBulletRebound();

        BulletMove();
    }

    /// <summary>
    /// 更新子弹反弹
    /// </summary>
    private void UpdateBulletRebound()
    {
    
    
        if (curDir != dir.left)
        {
    
    
            if (curTrans.position.x < viewportRect.x)//子弹跑到左边界
            {
    
    
                curDir = dir.left;
                curTrans.up = Vector3.Reflect(curTrans.up, Vector3.right);//计算子弹前进方向 在左侧面的反射向量 得到新的前进方向
            }
        }
        if (curDir != dir.up)
        {
    
    
            if (curTrans.position.y > viewportRect.y)//子弹跑到上边界
            {
    
    
                curDir = dir.up;
                curTrans.up = Vector3.Reflect(curTrans.up, Vector3.down);//更新前进方向
            }
        }
        if (curDir != dir.right)
        {
    
    
            if (curTrans.position.x > viewportRect.z)//子弹跑到右边界
            {
    
    
                curDir = dir.right;
                curTrans.up = Vector3.Reflect(curTrans.up, Vector3.left);//更新前进方向
            }
        }
        if (curDir != dir.down)
        {
    
    
            if (curTrans.position.y < viewportRect.w)//子弹跑到下边界
            {
    
    
                curDir = dir.down;
                curTrans.up = Vector3.Reflect(curTrans.up, Vector3.up);//更新前进方向
            }
        }
    }

    /// <summary>
    /// 子弹移动
    /// </summary>
    private void BulletMove()
    {
    
    
        if (lockSingleFish != null) // 如果有锁定的鱼
        {
    
    
            if (lockSingleFish.locking)// 锁定的这条鱼还在锁定状态
            {
    
    
                // 自当跟随
                Vector3 dir = lockSingleFish.transform.position - curTrans.position;
                curTrans.up = dir;//更新前进方向
                curTrans.Translate(Vector3.up * Time.deltaTime * speed);
            }
            else
                curTrans.Translate(Vector3.up * Time.deltaTime * speed);// 自当朝着前方打
        }
        else
            curTrans.Translate(Vector3.up * Time.deltaTime * speed);// 自当朝着前方打
    }
}

猜你喜欢

转载自blog.csdn.net/baidu_39447417/article/details/109449102