【Unity】多种⽅法实现第⼀⼈称⾓⾊移动(⼀)⾓⾊控制器
前⾔
在Unity中要实现第⼀⼈称视⾓移动的⽅法有很多,每种⽅法各有优劣,本次要介绍的就是使⽤⾓⾊控制器CharacterController来实现的⽅法。
在阅览下⾯的步骤之前,你⾸先需要⼀个第⼀⼈称视⾓的实体。
最简单的第⼀视⾓实体只需要⼀个Capsule和⼀个摄像机,就像这样:
这样,你就获得了⼀个最简单的⼈和⼀双能看见世界的眼睛(虽然没有四肢)
步骤⼀、使⽤⾓⾊控制器CharacterController实现⾓⾊的移动
接下来只要让它能动起来就达到了我们的⽬的。所以我们要给它绑定上⾓⾊控制器CharacterController组件
什么是⾓⾊控制器CharacterController
⾓⾊控制器CharacterController,是Unity提供的可以实现移动的组件
调⽤CharacterController下的**Move()**⽅法即可以实现最简单的⼈物移动。
同时,CharacterController下的isGrounded属性可以检测当前⼈物是否在地⾯上。
组件参数解释:
大学生活英语作文 Slope Limit 爬坡限制:⼩于或等于此⾓度时可以上坡
Step Offt 台阶⾼度
Skin Width ⽪肤宽度
Min Move Distance 最⼩移动距离
Center 中⼼点坐标
dlf
Radius 半径
Height ⾼度
简单的物体移动代码⽰例:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
public float speed = 6.0F;
public float jumpSpeed = 8.0F;
public float gravity = 20.0F;
private Vector3 moveDirection = ;
void Start()
{
float _horizontal = Input.GetAxis("Horizontal");
float _vertical = Input.GetAxis("Vertical");
}
void Update()
{
CharacterController controller = GetComponent<CharacterController>();
if (controller.isGrounded)
{
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton("Jump"))
moveDirection.y = jumpSpeed;
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
}
}
马的英文
注意事项:
⾓⾊控制器CharacterContriller和刚体不同,它没有碰撞效果,不可以像刚体⼀样对齐施加⼀个⼒。
步骤⼆、添加摄像机视⾓旋转代码
添加上⾓⾊控制器组件和代码之后,⼈物就可以随着我们键盘WASD进⾏移动了。
但是只会前后移动不会转⾝的⼈物可算不上是第⼀⼈称视⾓移动。因此我们需要在⾓⾊控制的代码基础上添加使摄像机视⾓旋转的代码。 通过GetAxis()获取⿏标的位移
tvb是什么意思Input.GetAxis("Mou X");
Input.GetAxis("Mou Y");
限定上下视⾓旋转的范围,(因为正常的⼈不可能纵向观察360度,但是我们可以通过转⾝观察到横向360度)float RotationY = Mathf.Clamp(RotationY, minmouY, maxmouY);伊藤隆大
需要注意的是,只有摄像机跟随视⾓旋转是不⾜够的,还需要让⼈物本⾝也⼀起旋转。
最后绑定在⼈物上的代码:1 202 129 170
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
qikpublic class PlayerMoveController : MonoBehaviour
{
CharacterController playerController;
Vector3 direction;
public float speed = 1;
public float jumpPower = 5;
public float gravity = 7f;
priorpublic float mouspeed = 5f;
public float minmouY = -45f;
public float maxmouY = 45f;
float RotationY = 0f;
float RotationX = 0f;
public Transform agretctCamera;
// U this for initialization
void Start()
{
playerController = this.GetComponent<CharacterController>();
}
// Update is called once per frame
void Update()
{skyscraper
float _horizontal = Input.GetAxis("Horizontal");
float _vertical = Input.GetAxis("Vertical");
if (playerController.isGrounded)
{
direction = new Vector3(_horizontal, 0, _vertical);
if (Input.GetKeyDown(KeyCode.Space))
direction.y = jumpPower;
}
direction.y -= gravity * Time.deltaTime;
playerController.ansform.TransformDirection(direction * Time.deltaTime * speed)); RotationX += ansform.localEulerAngles.y + Input.GetAxis("Mou X") * mouspeed;
RotationY -= Input.GetAxis("Mou Y") * mouspeed;
sign in
RotationY = Mathf.Clamp(RotationY, minmouY, maxmouY);
}
}