目录

1.对Unity脚本写入有一定的思维了解。

2.分析需求,观察了解要实现的项目的条件在Unity中的外在表现。

3.开始通过代码实现功能。

4.一个整体的代码实现

5.学习心得


PS:首先我们要知道,在C#中Transform组件是可以直接调用的,而其他的(例如:Rigidbody,Animator)都需要通过 GetConpoment<组件的名称>(); 来获取进行实例化(一般在初始化时)。

例子:调用Rigidbody2D

private Rigidbody2D rb2D;//声明变量实例化void Start(){rb2d = GetComponent<Rigidbody2D>();//获取}

1.对Unity脚本写入有一定的思维了解。

我们在C#中想要实现对Unity内各个组件、属性设置的修改和调用,首先要观察它在外部的形式,也就是Unity内的表现

比如我想要控制2D角色移动,那么改变的就它在X,Y轴上的坐标(横向和竖向),可以观察到每个物体的Transform组件下的Position就是该物体的坐标位置,所以我们只需要在脚本实现修改该坐标位置即可实现物体的移动。(见图1.1)

图1.1

2.分析需求,观察了解要实现的项目的条件在Unity中的外在表现。

a.上文已经提到,移动实际上就是物体坐标的改变,其次我们需要用键盘或鼠标对它进行控制,它需要有一个移动速度。

b.在Unity的Project Setting中可以看到它内置了Inpuut Manager,它作为对外和键盘鼠标交互。Horizontal控制物体在X轴上的运动,“A,D”输入(可以直接在外部修改)Vertical控制物体Y轴上的运动。(见图2.1)

图2.1

3.开始通过代码实现功能。

a.在Assets里新建Scripts文件夹用于存放脚本文件,在该文件夹中建立PlayerMovementController脚本。

b.需要设置的变量,移动速度moveSpeed,定义一个二维向量moveDir

using UnityEngine;public float MoveSpeed=3.0f;
private Vector2 moveDir = new Vector2();

ps:速度用public(把它暴露出去),方便我们在外部进行修改,表现是图3.1

图3.1

c.写移动函数

把二维向量的两个方向与键盘交互绑定,当按一下A键,X坐标就有左边的1的增量

private void MoveCharacter
{moveDir.x = Input.GetAxisRaw('Horizontal');moveDir.y =Input.GetAixisRaw('Vertical');moveDir.Normalize();//当有两个方向的向量时进行整合}

ps:Normalize 作为将两个方向向量合并处理的一个函数

图3.2

(1)调用transform代码实现

ps:因为我们这个组件做好后要挂到Player上,所以这里的transform都是直接调用的Player的。

在坐标位置上加上变化值

transform.position += Vector3(moveDir.x,moveDir.y,0.0f) * MoveSpeed * Time.deltaTime;

ps:其中Time.delate相当于一个变量,理解为在一定时间内完成上一帧的动作,运行有50帧,它就是0.02,它会随着电脑运行帧率而变化,目的是为了让游戏在不同电脑环境下都显得更为流畅稳定。

调用transform自带的Translate函数直接修改变化

transform.Translate(moveDir * MoveSpeed * Time.deltaTime);

(2)调用RigidBody2D实现代码

要先给Player挂上Rigidbody2D的组件,直接在Unity界面Player下Add Component

先声明变量

private RigidBody2D rb2d;

用Rigidbody2D内置的MovePosition函数

rb2d.MovePosition(new Vector2(transform.position.x,transform.position.y)+moveDir * MoveSpeed * Time.fixedDeltaTime);

在原坐标上增加变化值

rb2d.position += moveDir * MoveSpeed * Time.fixedDeltaTime;

把Player当作一个刚体,相当于给它一个速度推动移动,调用velocity函数,它内置了fixeddDeltaTime,所以不用乘出来

rb2D.velocity = moveDir * MoveSpeed;//velocity函数相当于内置了fixedDeltaTime,所以不用乘。

以上是利用Rigidbody2D的三种实现方法,这里用的Time.fixedDeltaTime,下面说一下它的解读以及和Time.deltaTime的区别。

使用Time.fixedDeltaTime要放到FixedUpdate运行,fixedUpdate的刷新根据fixedDeltaTime的时间来的,而它是一个固定值0.02,相当于是1秒50帧。

Update是每帧调用一次。

4.一个整体的代码实现

transfo:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMovementController : MonoBehaviour
{public float moveSpeed = 3.0f;private Vector2 movDir = new Vector2();private Rigidbody2D rb2d;void Start(){rb2d = GetComponent<Rigidbody2D>();}private void FixedUpdate(){MoveCharacter();}void Update(){UpdateState();}private void MoveCharacter(){movDir.x = Input.GetAxisRaw("Horizontal");movDir.y = Input.GetAxisRaw("Vertical");movDir.Normalize();transform.position += new Vector3(movDir.x, movDir.y,0.0f) * moveSpeed * Time.deltaTime;transform.Translate(movDir * moveSpeed * Time.deltaTime);}}

Rigidbody2D :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMovementController : MonoBehaviour
{public float moveSpeed = 3.0f;private Vector2 movDir = new Vector2();private Rigidbody2D rb2d;void Start(){rb2d = GetComponent<Rigidbody2D>();}private void FixedUpdate(){MoveCharacter();}void Update(){UpdateState();}private void MoveCharacter(){rb2d.MovePosition(new Vector2(transform.position.x, transform.position.y) + movDir * moveSpeed * Time.fixedDeltaTime);rb2d.position += movDir * moveSpeed * Time.fixedDeltaTime;rb2d.velocity = movDir * moveSpeed;}}

5.学习心得

最后说一点,我认为Unity的学习重在实践,多跟着别人的教学项目做,但不能单纯跟着,要多思考,它这个函数背后是怎么运作的,以后自己写别的时候这点要注意什么,上手之后有了问题再去解决,实践出真知一点没错。

我个人是先看视频,再着手做,做完后,再根据自己做的东西总结成笔记,最后来写成博客,就像是努力让别人也能接收,也是对自己知识的一种升级巩固。

(C#脚本)Unity中角色移动的几种实现方法,以及心得。(适合新手入门)相关推荐

  1. 关于UNITY中System.Drawing引用失败的处理方法

    关于UNITY中System.Drawing引用失败的处理方法 今天在使用EPPlus中,遇到一个处于This type has been forwarded to assembly 'System. ...

  2. HTML5中aside标签的两种使用方法

    aside元素在网站制作中主要有以下两种使用方法 1)被包含在article元素中作为主要内容的附属信息部分,其中的内容可以是与当前文章有关的相关资料.名次解释,等等. <article> ...

  3. JAVA中线程同步的几种实现方法

    JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...

  4. Word中繁体艺术字的两种制作方法(转)

    Word中繁体艺术字的两种制作方法(转) Word里的艺术字是大家平时常用的一项功能,但有时我们可能需要制作一些繁体艺术字,而这个看似简单的要求,实现起来却不是那么容易,因为Word里的繁简转换功能对 ...

  5. c语言中将十六进制数转换为十进制数程序,C语言中十六进制转十进制两种实现方法...

    C语言中十六进制转十进制两种实现方法 C语言 · 十六进制转十进制 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英 ...

  6. GCN】在NLP中应用GCN的几种构图方法整理

    GCN]在NLP中应用GCN的几种构图方法整理:https://blog.csdn.net/qq_27590277/article/details/106264292

  7. 产品设计中多见的四种倒角方法

    在工业设计中,对产品外观设计特别是关键点的把握,基本上离不开一个专业术语--倒角.无论是手绘画外观设计或是三维外观,都需要把握倒角的应用. 1.倒角定义 在机械设备制造中,倒角就是指将铸件的边角切割成 ...

  8. 图形编程中,旋转的三种表示方法

    图形编程中,旋转的三种表示方法分别是:矩阵.欧拉角和四元数. 本文总结这三种表示方法的特点: 性质 矩阵 欧拉角 四元数 在坐标系间转换 能 不能 不能 连续或增量旋转 能,但是转换速度慢 不能 能, ...

  9. 个人技术总结——Unity中角色动画制作及动画切换逻辑的实现

    这个作业属于哪个课程 软件工程实践2022春-F班 这个作业要求在哪里 软件工程实践总结&个人技术博客 这个作业的目标 课程回顾与总结+个人技术总结 其他参考文献 <Unity2018教 ...

最新文章

  1. 2022-2028年中国非溶聚丁苯橡胶行业市场竞争态势及发展前景分析报告
  2. stm32万年历流程图_STM32实现万年历..
  3. 对抗性攻击的原理简介
  4. Zookeeper集群脑裂问题
  5. OA项目15:权限管理实体设计及映射
  6. Visual Studio的语言服务器协议
  7. C++(STL):05---智能指针之unique_ptr
  8. 如何使mysql编码格式_Mysql设置编码方式及基本操作
  9. python调用库有哪些_十大Python机器学习常用库 python开发,你用过几个?
  10. python之HTML文件转PDF文件,python之把HTML文件转换成PDF格式文档
  11. 推荐一款颜值逆天且功能齐全的开源Shell工具
  12. 应用程序错误(0xc0000135)
  13. 传统就没新意? 年货节“走马灯”刷新H5创意理念
  14. RLS递归最小二乘法(Recursive Least Squares)
  15. 【python 算法接口】使用FastAPI框架快速构建高性能的api服务
  16. 敏捷项目管理21天学习计划--敏捷生命周期
  17. 写给初学者:VB 中 ByRef 与 ByVal 参数传递方式的区别
  18. 【电子设计】AD2019网状铜加地孔(缝合孔)
  19. 即构抓娃娃H5方案全球首家支持HTTPS,抓娃娃先从安全抓起!
  20. 饥荒联机版Mod开发——Class, Prefab, component,debug(四)

热门文章

  1. LSA,pLSA原理及其代码实现
  2. KMeans算法实现步骤介绍及Python代码
  3. 使用left join比直接使用where速度快的原因
  4. 2021年化工自动化控制仪表考试总结及化工自动化控制仪表考试技巧
  5. 淘宝桌面体验平台的设计与思考
  6. 解决黑苹果屏幕亮度重启不保存的问题,亲测10.12和10.14有效
  7. android 7 plus,手机别瞎买,iPhone7plus相当于什么档次的安卓机?看完就懂了!
  8. OAuth2客户端明文和用户密码为密文
  9. 宽带连接错误711:无法加载远程访问服务连接管理器
  10. ai人工智能大爆发_人工智能对企业的7大好处