Unity Pet跟随AI

思想是:宠物离的越远,速度越快,越近,速度越慢。可以做做距离插值

public float SpeedLerp = 1f;
public float SpeedMin = 0.5f;   	// 防止距离近的时候移动过慢
// -------
void Update(){
		// 触发条件
        mPetToPlayerDistance = Vector3.Distance(
            mCityPlayerCtl.Position, 
            mModelObj.transform.position);
        if (mPetToPlayerDistance < mSeekDistance)
        {
            mState = CityPetState.Idle;
        }
        else
        {
            mState = CityPetState.Seek;
        }

        switch (mState)
        {
            case CityPetState.Idle:
                Idle();
                break;
            case CityPetState.Seek:
                Seek();
                break;
            default:
                break;
        }
}

void Seek()
{
	// 计算朝向
    Vector3 vector = mCityPlayerCtl.transform.position - mModelObj.transform.position;
    vector = Vector3.ProjectOnPlane(vector, Vector3.up);
    var direct = Vector3.Normalize(vector);
#if UNITY_EDITOR
    Debug.DrawRay(mModelObj.transform.position, direct);
#endif
    // 计算"速度"
    var PetPosition = mModelObj.transform.position;
    var mMoveDestPos = mCityPlayerCtl.Position;
    mMoveDestPos += new Vector3(0, 1.5f, 0);

    float moveDelta = Mathf.Lerp(0, 
        mPetToPlayerDistance - mSeekDistance, 
        SpeedLerp * CommonData.DeltaTime);

    float minDelta = SpeedMin * CommonData.DeltaTime;
    moveDelta = Mathf.Max(moveDelta, minDelta);

    PetPosition = Vector3.MoveTowards(PetPosition, mMoveDestPos, moveDelta);

    mModelObj.transform.position = PetPosition;
    mModelObj.transform.forward =
        Vector3.Slerp(mModelObj.transform.forward, direct, CommonData.DeltaTime * 5);	
}

private void Idle()
{
     mLogicAnimator.SetInteger("MoveStage", 0);
     IsMoveAction = true;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值