Unity3D中玩家的移动方式,三大类型,八种方式
Unity3D,玩家的移动方式
一、数学位移
1.向量 + 向量2.Translate3.MoveTowards
二、角色控制器
1.Move2.SimpleMove
三、刚体
1.vcelocity2.AddForce3.MovePosition
这里我们用枚举的方式:
选择要选用的移动类型与方式,unity效果图
上代码:
设置枚举
public enum emMoveType //三种移动的方式:数学,角色控制器,刚体
{Mathf,CharacterController,Ridgidbody
}public enum emMathf_SubType //数学移动的三种方式
{Mathf,Translate,MoveTowards,
}public enum emCharacterController_SubType //角色控制器的两种方式
{Move,SimpleMove,
}public enum emRigidbody_SubType //刚体的三种方式
{Vcelocity,AddForce,MovePosition
}
定义初始变量
public class Player : MonoBehaviour
{// 定义枚举变量public emMoveType mMoveType;public emMathf_SubType mMathf_SubType;public emCharacterController_SubType mCharacterController_SubType;public emRigidbody_SubType mRigidbody_SubType;public float mMoveSpeed; //移动速度public float mRotateSpeed; //旋转速度public Rigidbody mRigidbody; //刚体变量public CharacterController mCharacterController; //角色控制器变量
> 初始化 Awake()
> ...
> 数学类型
// mMoveType = emMoveType.Mathf;if(mMoveType == emMoveType.CharacterController) //选择类型:角色控制器{mCharacterController = transform.GetComponent<CharacterController>(); //获取角色控制器组件,获取不到的话,获取添加的组件--角色控制器CharacterControllerif (mCharacterController == null){mCharacterController = transform.gameObject.AddComponent<CharacterController>();}//设置基础信息mCharacterController.center = new Vector3(0f, 0.65f, 0);mCharacterController.radius = 0.5f;mCharacterController.height = 1.23f;}
刚体类型
else if (mMoveType == emMoveType.Ridgidbody) //选择类型:刚体,先获取刚体组件,获取不到的话,去添加刚体,再获取{mRigidbody = transform.GetComponent<Rigidbody>();if (mRigidbody == null){mRigidbody = transform.gameObject.AddComponent<Rigidbody>();}//这里要添加一个角色碰撞器,与刚体配合使用CapsuleCollider capsuleCollider = transform.gameObject.AddComponent<CapsuleCollider>(); //设置信息 capsuleCollider.center = new Vector3(0f, 0.5f, 0f);capsuleCollider.radius = 0.5f;mRigidbody.constraints = RigidbodyConstraints.FreezeRotation;// | RigidbodyConstraints.FreezePositionY;mRigidbody.drag = 2f; //设置阻力}
数学类型
else if(mMoveType == emMoveType.Mathf) //选择类型:数学,只需要添加一个碰撞器{CapsuleCollider capsuleCollider = transform.gameObject.AddComponent<CapsuleCollider>();capsuleCollider.center = new Vector3(0f, 0.5f, 0f);capsuleCollider.radius = 0.5f;}
代码运行Update():
void Update(){//设置unity设置的移动方式float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");//当键盘按下的时候if (h != 0 || v != 0){//角色发生移动变化//1.旋转//2.移动Vector3 dir = new Vector3(h, 0, v);//设置四元数用来旋转。Quaternion targetQ = Quaternion.LookRotation(dir, Vector3.up);// transform.rotation = targetQ;transform.rotation = Quaternion.Lerp(transform.rotation, targetQ, Time.deltaTime * mRotateSpeed);switch (mMoveType){case emMoveType.Mathf:{if (mMathf_SubType == emMathf_SubType.Mathf){//向量的相加transform.position += transform.forward * Time.deltaTime * mMoveSpeed;}else if (mMathf_SubType == emMathf_SubType.Translate){//在平移的方向和距离上移动变换。transform.Translate(transform.forward * Time.deltaTime * mMoveSpeed, Space.World);}else if (mMathf_SubType == emMathf_SubType.MoveTowards){//计算当前和目标指定的点之间的位置,移动不超过maxDistanceDelta指定的距离。transform.position = Vector3.MoveTowards(transform.position,transform.position + transform.forward * Time.deltaTime * mMoveSpeed, Time.deltaTime * mMoveSpeed);}}break;case emMoveType.CharacterController:if (mCharacterController_SubType == emCharacterController_SubType.Move){//按帧移动,用附加的CharacterController组件来提供游戏对象的移动。//因为这里移动不受重力影响,所以加一个向下的移动来模拟重力mCharacterController.Move(-transform.up * Time.deltaTime * mMoveSpeed); mCharacterController.Move(transform.forward * Time.deltaTime * mMoveSpeed);}if (mCharacterController_SubType == emCharacterController_SubType.SimpleMove){//按秒移动,模拟重力,快速移动角色。mCharacterController.SimpleMove(transform.forward * mMoveSpeed);}break;case emMoveType.Ridgidbody:{if (mRigidbody_SubType == emRigidbody_SubType.Vcelocity){//按秒移动,刚体的速度矢量。它表示刚体位置的变化率。mRigidbody.velocity = transform.forward * mMoveSpeed;}else if (mRigidbody_SubType == emRigidbody_SubType.AddForce){//按秒移动,向刚体添加一个力,这里效果表示加一个力来对抗阻力mRigidbody.AddForce(transform.forward * mMoveSpeed);}else if (mRigidbody_SubType == emRigidbody_SubType.MovePosition){//将运动学刚体移动到某个位置。mRigidbody.MovePosition(transform.position + transform.forward * mMoveSpeed * Time.deltaTime);}}break;default:break;}}
Unity3D中玩家的移动方式,三大类型,八种方式相关推荐
- Unity3d中渲染到RenderTexture的原理,几种方式以及一些问题
本文中大部分例子将按照Opengles的实现来解释 1.RenderTexture是什么 在U3D中有一种特殊的Texture类型,叫做RenderTexture,它本质上一句话是将一个FrameBu ...
- form表单、控制器中接收表单提交数据的4种方式
Form表单 这篇文章主要讲的是form表单的提交 之前我们接触过的form表单元素是在Bootstrap框架里面,这次也将用到Bootstrap框架去布局(见图表1)通过Bootstrap框架布局呈 ...
- Oracle中函数/过程返回结果集的几种方式
原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. ...
- Java中创建(实例化)对象的五种方式
Java中创建(实例化)对象的五种方式 1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运 ...
- Android中实现SQLite数据库CRUD操作的两种方式
Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...
- asp.net中读取数据库中的数据可以使用DataReader和DataSet 2种方式(初学者望大家不要笑我)...
在asp.net中,读取数据库中的数据可以使用DataReader和DataSet 2种方式, 两者的差异如下: 使用Dataset对象读取数据大致需要以下5个步骤: (1)建立数据库 ...
- linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式
主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...
- Excel中数据透视表数据源更新的三种方式
Excel中数据透视表数据源更新的三种方式 1.在原有的基础上重新选择数据源 2.变数据源为表格形式,在创建一个透视表,之后如果添加的数据,选中透视表右键刷新即可 3.利用更新过的数据源再重新创建一个 ...
- android布局密码,Android中EditText显示明文与密码的两种方式
效果图如下所述: 布局 xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="h ...
- python中交换两个变量值的几种方式?
python中交换两个变量值的几种方式 1.python中独有的,也是最简单的方式: a,b=b,a 2.引入第三个变量,可以看作两个装满牛奶的瓶子a和瓶子b,如果我想交换这两个瓶子中的牛奶,就需要一 ...
最新文章
- 技术图文:如何在CSDN上写自己的技术Blog?
- 一个 Babelfish ,看懂云数据库的发展方向
- Sourceforge.net速度快的镜像 [zt]
- jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Young GC的
- 信号完整性分析心得体会_「职场技能」这8个常用信号完整性的测试手段,你知道几个?...
- Collatz函数的C++递归实现
- C语言操作mysql
- Linux IPC实践(4) --System V消息队列(1)
- YzmCMS轻量级开源CMS v6.2
- 名言为什么不能当论据_为什么您的工作场所论据没有您想要的那么有效
- 华为云MVP:来自工业制造领域的微服务与云平台实践
- Linux开机启动过程(12):start_kernel()->还是setup_arch
- 「动手学深度学习」在B站火到没谁,加这个免费实操平台,妥妥天花板
- 因子分析模型R语言实现
- 单细胞测序系列之三:单细胞转录组测序
- C语言基础学习——基本数据类型(char型)
- SAP ABAP BDC调用
- vue模板语法是什么?
- 对偶量子计算机,斯坦福大学:通过时空对偶性探索量子纠缠的动力学
- 二维数组(拷贝/扩容/删除)——Java