美文网首页
Unity物体移动的三种方式(CharacterControll

Unity物体移动的三种方式(CharacterControll

作者: MaloFleur | 来源:发表于2022-09-19 23:07 被阅读0次

在Unity中,想让物体移动,比较常见的方式有三种

  1. 借助CharacterController
    CharacterController中包含一个Move函数,调用cc.Move(distance)即可实现移动
  2. 借助RigidBody
    若物体中挂载了RigidBody,则也可以通过给物体施加力的方式实现移动
    即rigidBody.AddForce(force)
  3. 借助NavMeshAgent
    NavMeshAgent是Unity内置的一款寻路插件,将地平面plane设置为Navigation Static后,在Navigation页面进行Bake,即可生成路网,之后调用agent.SetDestination(targetPosition)即可实现移动
1.png 2.png

下面的代码展示了三种移动方式的简单使用方法
但要注意几点

  1. RigidBody和CharacterController不能同时挂在一个物体上(下面的代码只是一个示例,实际同时挂上两个组件,rigidbody的方法是无法运行的), 因为这两个组件是冲突的,添加了CharacterController组件后,人物将不受力影响,在脚本中通过rigidbody对人物施加力也是无效的。
  2. NavMeshAgent默认开启了UpdatePosition,只要调用SetDestination后,agent会自动带动gameobject开始移动,为了方便控制transform,往往会将UpdatePosition置为false,然后在gameobject自己的update中,令transform.position = agent.nextposition,也可以实现物体跟随agent移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RigidMove : MonoBehaviour
{
    private Rigidbody rigidBody;
    private CharacterController cc;
    private UnityEngine.AI.NavMeshAgent agent;
    // Start is called before the first frame update
    void Start()
    {
        rigidBody = gameObject.GetComponent<Rigidbody>();
        cc = gameObject.GetComponent<CharacterController>();
        agent = gameObject.GetComponent<UnityEngine.AI.NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKey(KeyCode.A))
        {
            rigidBody.AddForce(transform.up * 20);
        }
        if (Input.GetKey(KeyCode.S))
        {
            cc.Move(transform.forward);
        }
        if (Input.GetKey(KeyCode.D))
        {
            agent.SetDestination(transform.forward * 10);
        }
    }
}

相关文章

网友评论

      本文标题:Unity物体移动的三种方式(CharacterControll

      本文链接:https://www.haomeiwen.com/subject/fxzvortx.html