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中玩家的移动方式,三大类型,八种方式相关推荐

  1. Unity3d中渲染到RenderTexture的原理,几种方式以及一些问题

    本文中大部分例子将按照Opengles的实现来解释 1.RenderTexture是什么 在U3D中有一种特殊的Texture类型,叫做RenderTexture,它本质上一句话是将一个FrameBu ...

  2. form表单、控制器中接收表单提交数据的4种方式

    Form表单 这篇文章主要讲的是form表单的提交 之前我们接触过的form表单元素是在Bootstrap框架里面,这次也将用到Bootstrap框架去布局(见图表1)通过Bootstrap框架布局呈 ...

  3. Oracle中函数/过程返回结果集的几种方式

    原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式:     以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.   ...

  4. Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式 1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23);  3.运 ...

  5. Android中实现SQLite数据库CRUD操作的两种方式

    Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...

  6. asp.net中读取数据库中的数据可以使用DataReader和DataSet 2种方式(初学者望大家不要笑我)...

    在asp.net中,读取数据库中的数据可以使用DataReader和DataSet 2种方式, 两者的差异如下:     使用Dataset对象读取数据大致需要以下5个步骤:     (1)建立数据库 ...

  7. linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

  8. Excel中数据透视表数据源更新的三种方式

    Excel中数据透视表数据源更新的三种方式 1.在原有的基础上重新选择数据源 2.变数据源为表格形式,在创建一个透视表,之后如果添加的数据,选中透视表右键刷新即可 3.利用更新过的数据源再重新创建一个 ...

  9. android布局密码,Android中EditText显示明文与密码的两种方式

    效果图如下所述: 布局 xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="h ...

  10. python中交换两个变量值的几种方式?

    python中交换两个变量值的几种方式 1.python中独有的,也是最简单的方式: a,b=b,a 2.引入第三个变量,可以看作两个装满牛奶的瓶子a和瓶子b,如果我想交换这两个瓶子中的牛奶,就需要一 ...

最新文章

  1. 技术图文:如何在CSDN上写自己的技术Blog?
  2. 一个 Babelfish ,看懂云数据库的发展方向
  3. Sourceforge.net速度快的镜像 [zt]
  4. jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Young GC的
  5. 信号完整性分析心得体会_「职场技能」这8个常用信号完整性的测试手段,你知道几个?...
  6. Collatz函数的C++递归实现
  7. C语言操作mysql
  8. Linux IPC实践(4) --System V消息队列(1)
  9. YzmCMS轻量级开源CMS v6.2
  10. 名言为什么不能当论据_为什么您的工作场所论据没有您想要的那么有效
  11. 华为云MVP:来自工业制造领域的微服务与云平台实践
  12. Linux开机启动过程(12):start_kernel()->还是setup_arch
  13. 「动手学深度学习」在B站火到没谁,加这个免费实操平台,妥妥天花板
  14. 因子分析模型R语言实现
  15. 单细胞测序系列之三:单细胞转录组测序
  16. C语言基础学习——基本数据类型(char型)
  17. SAP ABAP BDC调用
  18. vue模板语法是什么?
  19. 对偶量子计算机,斯坦福大学:通过时空对偶性探索量子纠缠的动力学
  20. 二维数组(拷贝/扩容/删除)——Java

热门文章

  1. 带宽单位和下载速度的换算
  2. LoadLibrary加载dll失败的问题
  3. SEO知识:百度谷歌搜狗谷歌必应搜索引擎蜘蛛的特点
  4. 最大传输单元:MTU
  5. 【金融案例分析03】深度解读:光大证券乌龙指事件是怎么回事?(套利交易、基金背后的金融原理,事件的过程与定性)
  6. 微生物组实验手册:中科院、北大和清华等52家单位的74个团队的153篇方法正在创作中(15篇已投稿)...
  7. Matplotlib绘制立方体示意图-伪三维
  8. C语言实现打印平行四边形
  9. 第六章 (数据库) 第3节 数据库高级
  10. YYH的营救计划(NOIP模拟赛Round 6)