在Unity中,想让物体移动,比较常见的方式有三种
- 借助CharacterController
CharacterController中包含一个Move函数,调用cc.Move(distance)即可实现移动 - 借助RigidBody
若物体中挂载了RigidBody,则也可以通过给物体施加力的方式实现移动
即rigidBody.AddForce(force) - 借助NavMeshAgent
NavMeshAgent是Unity内置的一款寻路插件,将地平面plane设置为Navigation Static后,在Navigation页面进行Bake,即可生成路网,之后调用agent.SetDestination(targetPosition)即可实现移动
下面的代码展示了三种移动方式的简单使用方法
但要注意几点
- RigidBody和CharacterController不能同时挂在一个物体上(下面的代码只是一个示例,实际同时挂上两个组件,rigidbody的方法是无法运行的), 因为这两个组件是冲突的,添加了CharacterController组件后,人物将不受力影响,在脚本中通过rigidbody对人物施加力也是无效的。
- 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);
}
}
}
网友评论