Unity 模拟抛物线

  public Transform target;
    //发射速度
    public float speed = 30f;
    //最小接近距离
    private float min_distance = 0f;
    //是否需要追踪
    private bool IsTrace = false;
    //炮弹与目标点距离
    private float distanceToTarget;
    //是否移动
    private bool move_flag = true;
    //目标点坐标
    private Vector3 TargetPosition = Vector3.zero;
    //击中目标点时与目标点的角度
    public float HitAngle = 90f;
    //击中特效
    private GameObject HitEffect;

    private void Awake()
    {
       // HitEffect = Resources.Load("Prefabs/ShellHitEffect/FX_ZiMuDan_ChildHit") as GameObject;
    }

    /// <summary>
    /// 参数: 攻击目标点、发射速度、最小停止运动距离
    /// </summary>
    public void SetShellData(Transform target, float speed, float distance, float hitAngle, bool isTrace)
    {
        this.target = target;
        TargetPosition = this.target.position;
        this.speed = speed;
        min_distance = distance;
        HitAngle = hitAngle;
        IsTrace = isTrace;
        distanceToTarget = Vector3.Distance(transform.position, this.target.position);
    }

    /// <summary>
    /// 发射炮弹
    /// </summary>
    public void Shoot()
    {
        StartCoroutine(Parabola2());
    }

    /// <summary>
    /// 炮弹主要实现
    /// </summary>
    /// <returns></returns>
    IEnumerator Parabola2()
    {
        while (move_flag)
        {
            if (IsTrace)
            {
                TargetPosition = target.position;
            }
            transform.LookAt(TargetPosition);
            float angle = Mathf.Min(1, Vector3.Distance(transform.position, TargetPosition) / distanceToTarget) * HitAngle;
            transform.rotation = transform.rotation * Quaternion.Euler(Mathf.Clamp(-angle, -42, 42), 0, 0);
            float currentDist = Vector3.Distance(transform.position, TargetPosition);
            if (currentDist < min_distance)
            {
                move_flag = false;
            }
            transform.Translate(Vector3.forward * Mathf.Min(speed * Time.deltaTime, currentDist));
            yield return null;
        }
        if (move_flag == false)
        {
            transform.position = TargetPosition;
            StopCoroutine(Parabola2());
            //GameObject vfx = Instantiate(HitEffect);
            //vfx.transform.position = transform.position;
            //Destroy(gameObject);
        }
    }


    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            SetShellData(target, speed, min_distance, HitAngle, true);
            Shoot();
        }
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值