下面是详细的Unity3D实现人物移动示例攻略。
步骤一:创建场景和人物
首先,打开Unity3D编辑器,创建一个新的场景(File -> New Scene)。然后在场景中创建一个人物模型或导入一个已有的人物模型。
步骤二:添加角色控制器
为了让人物实现移动,我们需要在人物对象上添加一个角色控制器(Character Controller)。在Unity中,角色控制器用于处理人物的移动和碰撞检测,我们可以通过点击人物对象,在Inspector面板中点击“Add Component”按钮,选择“Character Controller”来添加控制器。
步骤三:编写脚本
接下来,我们需要编写一个脚本来控制人物的移动。在工程文件夹中,右键点击Scripts文件夹,选择Create -> C# Script来创建一个新脚本。将脚本文件重命名为“PlayerController”。
打开PlayerController文件,并在文件中添加以下代码(代码中注释已说明各行代码的作用):
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] private float moveSpeed = 5.0f; // 移动速度
private CharacterController characterController; // 角色控制器
private void Awake()
{
// 获取角色控制器组件
characterController = GetComponent<CharacterController>();
}
private void Update()
{
// 水平轴,即x轴和z轴方向的平移
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
// 计算移动的方向
Vector3 moveDirection = transform.right * horizontalInput + transform.forward * verticalInput;
// 将移动方向转为世界坐标系下的方向
moveDirection = transform.TransformDirection(moveDirection);
// 设置人物行走速度
moveDirection *= moveSpeed;
// 使用角色控制器进行移动
characterController.Move(moveDirection * Time.deltaTime);
}
}
步骤四:将脚本挂载到人物对象上
将PlayerController脚本文件拖拽到人物对象(GameObject)上,即可将脚本挂载到人物对象上。
示例说明一:限制人物在地面上移动
我们发现,上述代码中的角色控制器并没有任何限制,如果我们让人物跳起来,它也可以在空中无阻碍的移动。为了限制人物只能在地面上移动,我们需要在代码中对角色控制器进行一些修改。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] private float moveSpeed = 5.0f; // 移动速度
private CharacterController characterController; // 角色控制器
private bool isGrounded; // 是否在地面上
private void Awake()
{
// 获取角色控制器组件
characterController = GetComponent<CharacterController>();
}
private void Update()
{
// 判断是否在地面上
isGrounded = Physics.Raycast(transform.position, Vector3.down, characterController.height / 2);
// 水平轴,即x轴和z轴方向的平移
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
// 计算移动的方向
Vector3 moveDirection = transform.right * horizontalInput + transform.forward * verticalInput;
// 将移动方向转为世界坐标系下的方向
moveDirection = transform.TransformDirection(moveDirection);
// 设置人物行走速度
moveDirection *= moveSpeed;
// 只有在地面上才能移动
if (isGrounded)
{
// 使用角色控制器进行移动
characterController.Move(moveDirection * Time.deltaTime);
}
}
}
上述代码中,我们使用了Physics.Raycast方法来判断人物是否在地面上,如果在地面上才执行移动操作。
示例说明二:通过摄像机控制人物移动
在上面的示例中,我们控制人物的移动是通过水平和垂直轴的输入来控制的。如果我们想通过摄像机的移动控制人物的移动,应该如何实现呢?
我们可以在场景中添加一个摄像机,然后将摄像机对象添加到脚本中,并且以摄像机位置和旋转角度为基准来计算人物的移动方向。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] private float moveSpeed = 5.0f; // 移动速度
private CharacterController characterController; // 角色控制器
private Camera mainCamera; // 主摄像机
private void Awake()
{
// 获取角色控制器组件和主摄像机组件
characterController = GetComponent<CharacterController>();
mainCamera = Camera.main;
}
private void Update()
{
// 水平轴,即x轴和z轴方向的平移
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
// 计算人物前进方向
Vector3 forward = mainCamera.transform.forward;
forward.y = 0;
forward.Normalize();
// 计算人物右侧方向
Vector3 right = mainCamera.transform.right;
right.y = 0;
right.Normalize();
// 根据输入的方向计算人物移动方向
Vector3 moveDirection = forward * verticalInput + right * horizontalInput;
// 设置人物行走速度
moveDirection *= moveSpeed;
// 使用角色控制器进行移动
characterController.Move(moveDirection * Time.deltaTime);
}
}
上述代码中,我们使用了Camera.main来获取场景中的主摄像机(如果有多个摄像机,则无法正确定位到主摄像机才能使用此方法),用主摄像机的位置和右侧方向向量来计算人物移动的方向。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Unity3D实现人物移动示例 - Python技术站