Unity实现物体被撞飞后边持续旋转边抛物线运动

Prop类

public Vector3[] leftTargetPosition;   // 道具做抛物线运动的目标位置的数组(左侧)
public Vector3[] rightTargetPosition;  // 道具做抛物线运动的目标位置的数组(右侧)
public Vector3[] middleTargetPosition; // 道具做抛物线运动的目标位置的数组(中间)


private void Awake()
{
    // 将指定位置存入数组
    rightTargetPosition = new Vector3[]
    {
        new Vector3(13f, 6f, 9f),new Vector3(15f,6f,0f)
    };

    leftTargetPosition = new Vector3[]
    {
        new Vector3(-5f, 6f, 9f),new Vector3(-8f, 6f, 0f)
    };

    middleTargetPosition = new Vector3[]
    {
        new Vector3(2f, 6f, 9f),new Vector3(6f, 6f, 10f)
    };
}

// Player类中,当Player与两个路标道具相撞,调用此方法
// 如果Player在跑道左侧 则道具被撞飞到跑道左侧
// 如果Player在跑道右侧 则道具被撞飞到跑道右侧
// 如果Player在中间 则道具被撞飞到前面
public void collideSign(Vector3[] TargetPosition)
{
    transform.GetComponent<BoxCollider>().enabled = false;
    Vector3 targetPos = TargetPosition[UnityEngine.Random.Range(0, TargetPosition.Length)];
    JumpTo(targetPos);
}


public void JumpTo(Vector3 targetPos)
{
    // 抛物线运动效果
    transform.DOMove(targetPos, 2f).OnComplete(() => GameObject.Destroy(this.gameObject));
    // 持续旋转效果
    transform.DORotate(new Vector3(360, 360, 360), 2f, RotateMode.FastBeyond360).SetLoops(-1);
}

调用时,写在Player类的碰撞检测方法中:

private void OnTriggerEnter(Collider other)
{
    var propObj = other.transform.gameObject.GetComponent<PropObj>(); // 获取碰撞物体所挂载的道具类 
    if (propObj == null) return;  // 确保碰撞到的只会是挂载了道具类的物体(道具)

    var prop = propObj.pType;   // 获取道具类中的枚举类型

    switch (prop)
    {
        case PropType.ConeObject:  // 锥形路标

            if (GetDirecton() == MoveDirection.Left)
            { 
                propObj.collideSign(propObj.leftTargetPosition);
            }
           else if (GetDirecton() == MoveDirection.Right) 
            {
                propObj.collideSign(propObj.rightTargetPosition);
            } 
            else 
            {
                propObj.collideSign(propObj.middleTargetPosition);
            }
            break;

        case PropType.WarningObject:  // 警示路标

            if (GetDirecton() == MoveDirection.Left)
            {
                propObj.collideSign(propObj.leftTargetPosition);
            }
            else if (GetDirecton() == MoveDirection.Right)
            {
                propObj.collideSign(propObj.rightTargetPosition);
            }
            else
            {
                propObj.collideSign(propObj.middleTargetPosition);
            }
            break;
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值