unity3D实例学习:JohnLemon

在将模型导入到Scenes视图中,为角色加入动画后,角色出现沿Y轴向上升的情况:

原因:因为觉得的动画和RigidBody物理系统发生了冲突。

解决方案:把Updata Mode从Normal模式改变为Animate Physics,然后锁定刚体中的Y轴。

实现物理交互的组件一般在FixUpdata中实现。

在update中获取键盘输入:

void Update()
    {
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
    }

为了达到移动的效果,在start函数中获取刚体和动画组件:

void Start()
    {
        m_Rigidbody = GetComponent<Rigidbody>();
        m_animator = GetComponent<Animator>();
    }

玩家移动:

private void FixedUpdate()
    {
        //组装为运动需要的三维矢量
        m_Movement.Set(horizontal, 0.0f, vertical);
        m_Movement.Normalize();

        bool hasHorizontal = !Mathf.Approximately(horizontal, 0.0f);
        bool hasVertical = !Mathf.Approximately(vertical, 0.0f);
        //只要有一个方向移动,就代表玩家游戏角色是移动状态
        bool isWalking = hasHorizontal || hasVertical;
        m_animator.SetBool("isWalking", isWalking);
    }
    private void OnAnimatorMove()
    {
        //使用从用户输入获取到的值作为方向,使用动画中fixupdate中的刷新作为移动的速度
        m_Rigidbody.MovePosition(m_Rigidbody.position +m_Movement*m_animator.deltaPosition.magnitude);

    }

角色转向:

//创建一个四元数,用于控制转向,初始化为不旋转
Quaternion m_Rotation = Quaternion.identity;
public float tureSpeed = 20.0f;
private void FixedUpdate()
    {
        //组装为运动需要的三维矢量
        m_Movement.Set(horizontal, 0.0f, vertical);
        m_Movement.Normalize();

        bool hasHorizontal = !Mathf.Approximately(horizontal, 0.0f);
        bool hasVertical = !Mathf.Approximately(vertical, 0.0f);
        //只要有一个方向移动,就代表玩家游戏角色是移动状态
        bool isWalking = hasHorizontal || hasVertical;
        m_animator.SetBool("isWalking", isWalking);

        Vector3 desireForward = Vector3.RotateTowards(transform.forward,m_Movement,tureSpeed*Time.deltaTime,0.0f);
        //设置四元数
        m_Rotation = Quaternion.LookRotation(desireForward);

    }
    private void OnAnimatorMove()
    {
        //使用从用户输入获取到的值作为方向,使用动画中fixupdate中的刷新作为移动的速度
        m_Rigidbody.MovePosition(m_Rigidbody.position +m_Movement*m_animator.deltaPosition.magnitude);
        m_Rigidbody.MoveRotation(m_Rotation);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值