U3D游戏移动方法

U3D游戏移动方法

游戏中人物和怪物的移动是不可缺少的,这里就给大家介绍一些常见的Unity中的移动方法。我用到的软件是Unity3D和Visual Studio。

  1. 首先我们打开Unity软件,新建一个工程,取名为MoveProgram。在这里插入图片描述
  2. 新建完成后,进入工程,新建一个Plane当作地板,然后再新建一个Sphere(小球)当作我们的角色。
    在这里插入图片描述
  3. 为小球添加刚体(Rigidbody),并在Assets文件夹下新建Floder(文件夹),取名为Scripts存放我们要用到的Script脚本。
    在这里插入图片描述
    新建C#Script脚本,取名为Move。
    在这里插入图片描述

第一种移动方法(Tranform组件的操作)

通过Transform组件移动物体,Transform组件用于描述物体在空间中的状态,它包括位置(Position),旋转(Rotation),缩放(Scale),这里所说的通Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(Position)。
在这里插入图片描述

  1. 打开我们的Move脚本,进行代码的编写。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour {
    //速度变量
    public float m_speed = 5f;
	void Start () {
		
	}
	void Update () {
        float h = Input.GetAxis("Horizontal");    //获取水平方向的输入(对应键盘的A,D 和左右方向键)
        float v = Input.GetAxis("Vertical");      //获取垂直方向的输入(对应键盘的W,S 和上下方向键)
        if (h != 0 || v != 0)                     //若有一个输入不为0,移动
        {
            PlayerMove(h, v);
        }
	}
    /// <summary>
    /// 移动方法
    /// </summary>
    /// <param name="h"></param>
    /// <param name="v"></param>
    void PlayerMove(float h,float v)
    {
        transform.Translate(transform.forward * v * m_speed * Time.deltaTime);
        transform.Translate(transform.right * h * m_speed * Time.deltaTime);
    }
}

  1. 将Move脚本加载到小球(Sphere)上,小球就可以根据我们键盘的输入(WASD上下左右)移动了,我是默认的Z轴向前的坐标系。
    在这里插入图片描述
    在这里插入图片描述

第二种移动方法(Rigidbody组件的操作)

之前我们特意为小球加上了Rigidbody刚体的组件,前面仅仅是使用了刚体组件的重力效果,现在我们要对Rigidbody进行操作,使角色移动起来。

  1. 为了更直观,我们换一个物体当作我们的角色,删除掉小球的Object,新建一个Capsule(胶囊体),同样的为它添加上Rigidbody刚体和Move脚本。
    在这里插入图片描述
  2. 为什么要专门用一个Capsule来作为角色呢,不觉得Capsule的形状更像一个人吗,我们的移动方式是向前向后,转身。所以我们让物体获得旋转地方法。现在修改我们的Move脚本。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour {
    //速度变量
    public float m_speed = 5f;
    //旋转速度
    public float m_rotate = 30f;
    //刚体组件
    Rigidbody rigid;
	void Start () {
        rigid = GetComponent<Rigidbody>();        //获取到自身的Rigidbody刚体组件
	}
	void Update () {
        float h = Input.GetAxis("Horizontal");    //获取水平方向的输入(对应键盘的A,D 和左右方向键)
        float v = Input.GetAxis("Vertical");      //获取垂直方向的输入(对应键盘的W,S 和上下方向键)
        if (h != 0 || v != 0)                     //若有一个输入不为0,移动
        {
            PlayerMove(h, v);
        }
	}
    /// <summary>
    /// 移动方法
    /// </summary>
    /// <param name="h"></param>
    /// <param name="v"></param>
    void PlayerMove(float h,float v)
    {
        rigid.AddForce(transform.forward * v * m_speed * Time.deltaTime);     //收到向前的力
        transform.Rotate(transform.up * h * m_rotate* Time.deltaTime);        //绕着自身Y轴旋转 
    }
}

  1. 现在来通过键盘控制看一下我们的Capsule的移动。
    在这里插入图片描述
    我们的角色已经可以根据键盘输入旋转,但当按住上下键想向前后移动时却倒了,这就是因为我们使用的Rigidbody的AddForce方法,它就是附加给刚体一个力,就像我们假如身后遭受到一股大的力也会倒一样。但我们想要的效果并不是这样,所以我们打开Capsule属性面板的Rigidbody里将旋转的轴锁死,然后增大我们的speed(现在其实是作为释放给刚体的力的大小)为500(可以直接在Unity里操作)。
    在这里插入图片描述
    之后我们运行的效果如下:(大概达到了我们想要的效果)
    在这里插入图片描述
    再为大家展示一个刚体的移动方法(Rigidbody.velocity)
    打开我们的Move脚本的移动方法进行修改
void PlayerMove(float h,float v)
    {
        rigid.velocity=transform.forward * v * m_speed;     //向前移动
        transform.Rotate(transform.up * h * m_rotate* Time.deltaTime);        //绕着自身Y轴旋转 
    }

将脚本里的速度Speed改回5,不然我们的角色会飞出屏幕的,然后运行效果如下。在这里插入图片描述
那两种方法有什么区别呢?
Rigidbody.velocity
这个方法是瞬间给物体一个恒定的速度,将物体提升至该速度。

Rigidbody.addForce
这个方法瞬间给物体一个规定好的力,如果一直按住,速度会越来越快,当然我们也可以加一个限制条件,当速度达到一定值时不在改变。

第三种方法(CharacterController组件的操作)

角色的移动基本作为一个游戏无法缺少的一部分,Unity作为一个游戏引擎当然也为我们提供了现成的移动方法。

  1. 我们删除掉Capsule上的刚体,加载CharacterController组件。
    在这里插入图片描述
  2. CharacterController.SimpleMove()方法
    用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。
    修改Move脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour {
    //速度变量
    public float m_speed = 5f;
    //旋转速度
    public float m_rotate = 30f;
    //角色控制组件
    CharacterController cc;
	void Start () {
        cc = GetComponent<CharacterController>();        //获取到自身的角色控制组件
	}
	void Update () {
        float h = Input.GetAxis("Horizontal");    //获取水平方向的输入(对应键盘的A,D 和左右方向键)
        float v = Input.GetAxis("Vertical");      //获取垂直方向的输入(对应键盘的W,S 和上下方向键)
        if (h != 0 || v != 0)                     //若有一个输入不为0,移动
        {
            PlayerMove(h, v);
        }
	}
    /// <summary>
    /// 移动方法
    /// </summary>
    /// <param name="h"></param>
    /// <param name="v"></param>
    void PlayerMove(float h,float v)
    {
        cc.SimpleMove(transform.forward * m_speed * v);     //向前移动
        transform.Rotate(transform.up * h * m_rotate* Time.deltaTime);        //绕着自身Y轴旋转 
    }
}

效果如下:
在这里插入图片描述

CharacterController.Move()方法
模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。
修改Move脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour {
    //速度变量
    public float m_speed = 5f;
    //旋转速度
    public float m_rotate = 30f;
    //重力变量
    public float gravity = 9.8f;
    //角色控制组件
    CharacterController cc;
    //用于更新重力
    Vector3 playerVelocity;
	void Start () {
        cc = GetComponent<CharacterController>();        //获取到自身的角色控制组件
        playerVelocity = Vecter3.zero;
	}
	void Update () {
        float h = Input.GetAxis("Horizontal");    //获取水平方向的输入(对应键盘的A,D 和左右方向键)
        float v = Input.GetAxis("Vertical");      //获取垂直方向的输入(对应键盘的W,S 和上下方向键)
        if (h != 0 || v != 0)                     //若有一个输入不为0,移动
        {
            PlayerMove(h, v);
        }
        //更新重力
        playerVelocity.y += cc.isGrounded ? 0f : Physics.gravity.y * gravity * Time.deltaTime;
        cc.Move(playerVelocity);
	}
    /// <summary>
    /// 移动方法
    /// </summary>
    /// <param name="h"></param>
    /// <param name="v"></param>
    void PlayerMove(float h,float v)
    {
        cc.Move(transform.forward * v*m_speed*Time.deltaTime);
        transform.Rotate(transform.up * h * m_rotate* Time.deltaTime);        //绕着自身Y轴旋转 
    }
}

效果如下
在这里插入图片描述

这就是一些最基础的Unity3d游戏角色的移动方法。我现在也是在学习的过程中,如果有什么内容中不懂的问题或者错误请联系我邮箱[email protected]。这次的东西比较简单,以后的一些东西我会附上源文件供大家参考利用,谢谢大家。

大家一起学习进步,希望结交各位热爱游戏的朋友。

猜你喜欢

转载自blog.csdn.net/qq_37176118/article/details/84189245