涉及方法:
-
本文分别采用了 ‘collider+rigidbody’ / ‘character controller’ 两种方式共四种情况来分享
-
在代码中input采用unity基本的“Horizontal”+“Vertical”输入获取(unity新的那个input system用过包但还没自己实际了解过嘿嘿(●ˇ∀ˇ●))
-
如果是collider+rigidbody的话,使用的是rigidbody的MovePosition()方法
如果是character controller的话使用的是该控制器的simplemove函数(对应还有一个move函数,区别在于simplemove在被调用时将使物体具备重力,move函数则和translate相似。)
-
对于鼠标控制方向的情况通过raycast+getpoint方法获取当前主摄像机与鼠标产生的射线找到与平面的交点,然后使用transform组件的LookAt方法调整朝向。
【使用character controller】准备:
- 在unity中创建好基本的平面和胶囊作为场景和角色(蓝色为z轴,代表transform.forward,即正面)
- 为平面添加collider(带2d的是2D项目使用的组件),为胶囊(角色)添加character controller(新建的胶囊会自带一个collider1,在添加character controller后会自带另一个collider2,所以可以将collider1删掉)
【使用character controller】编写move脚本:
第一种情况:角色移动方向与角色朝向一致:
{一些细节和注意事项都写在代码注释中辣~}
using UnityEngine;
/**
* 功能:角色移动控制[角色移动时永远朝正面]
*
*/
public class move : MonoBehaviour
{
//速度变量
public float speed;
//定义角色控制器
public CharacterController cc;
void Start()
{
//组件cc变量
cc = transform.GetComponent<CharacterController>();
//速度赋值
speed = 10;
}
void Update()
{
//调用移动方法
move_by_cc();
}
void move_by_cc()
{
//水平方向的输入获取(即A-D键或←→键)
float x = Input.GetAxisRaw("Horizontal");
//垂直方面的输入获取
float z = Input.GetAxisRaw("Vertical");
/* GetAxis()的返回值初始为0,在-1到1之间变化,对应的GetAxisRaw()则不会变化,直接返回1或-1 */
/*上面的input使用GetAxis()时在松开按键后角色会继续移动一小部分距离,会产生一种“冰面滑动”的效果,
使用GetAxisRaw()的话则即按即动,即松即停*/
if (Mathf.Abs(x)>0.1f || Mathf.Abs(z) > 0.1f)
{
//移动方向
Vector3 toward_dir = new Vector3(x, 0, z);
//角色朝向与移动方向一致
transform.LookAt(transform.position + toward_dir);