(C#脚本)Unity中角色移动的几种实现办法,以及
目录
1.对Unity脚本写入有一定的思维了解。
2.分析需求,观察了解要实现的项目的条件在Unity中的外在表现。
3.开始通过代码实现功能。
4.一个整体的代码实现
5.学习心得
PS我们要知道,在C#中Transform组件是可以直接调用的,而其他的(例如Rigidbody,Animator)都需要通过 GetConpoment<组件的名称>(); 来获取进行实例化(一般在初始化时)。
例子调用Rigidbody2D
private Rigidbody2D rb2D;//声明变量实例化 void Start() { rb2d = GetComponent1.对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 = ne Vector2();
ps速度用public(把它暴露出去),方便我们在外部进行修改,表现是图3.1
图3.1
c.写移动函数
把二维向量的两个方向与键盘交互绑定,当按一下A键,X坐标就有左边的1的增量
private void MoveCharacter { moveDir.x = Input.GetAxisRa('Horizontal'); moveDir.y =Input.GetAixisRa('Vertical'); moveDir.Normalize();//当有两个方向的向量时进行整合 }
psNormalize 作为将两个方向向量合并处理的一个函数
图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(ne 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 = ne Vector2(); private Rigidbody2D rb2d; void Start() { rb2d = GetComponent(); } private void FixedUpdate() { MoveCharacter(); } void Update() { UpdateState(); } private void MoveCharacter() { movDir.x = Input.GetAxisRa("Horizontal"); movDir.y = Input.GetAxisRa("Vertical"); movDir.Normalize(); transform.position += ne 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 = ne Vector2(); private Rigidbody2D rb2d; void Start() { rb2d = GetComponent5.学习心得(); } private void FixedUpdate() { MoveCharacter(); } void Update() { UpdateState(); } private void MoveCharacter() { rb2d.MovePosition(ne Vector2(transform.position.x, transform.position.y) + movDir moveSpeed Time.fixedDeltaTime); rb2d.position += movDir moveSpeed Time.fixedDeltaTime; rb2d.velocity = movDir moveSpeed; } }
说一点,我认为Unity的学习重在实践,多跟着别人的教学项目做,但不能单纯跟着,要多思考,它这个函数背后是怎么运作的,以后自己写别的时候这点要注意什么,上手之后有了问题再去解决,实践出真知一点没错。
我个人是先看视频,再着手做,做完后,再根据自己做的东西成笔记,来写成博客,就像是努力让别人也能接收,也是对自己知识的一种升级巩固。