Unity暑期萌新入门:玩家角色(二)

作者:Truly
大家好,之前继Unity暑期萌新入门:玩家角色(一)之后,
貌似被吞掉了一篇文章!!!∑(゚Д゚ノ)ノ,现在来帮大家补上哦(`^´)ノ
上一节,我们为John设置了动画和物理系统,这一节我们将为John添加Script(脚本),用来控制John运动。对于没有编程基础的小伙伴来说,这可能会是第一个“劝退关卡”。因此,大家也可以选择“云通关”,在理解思路的基础上,跟着敲一遍或者化身复制粘贴小能手。

还有个温馨提示,符号记得要用英文输入法。
一、创建脚本
在Project视窗中打开Assets > Scripts文件夹,右键选择Create > C# Script,文件命名为PlayerMovement。(如果后来要重命名,请保持文件名和类名(Class)一致,萌新如果命名错误,建议重新创建脚本)


二、编辑脚本
左键双击PlayerMovement用Visual Studio打开脚本,没有注册Visual Studio的小伙伴可以先注册(免费的哦)。
1 基本思路
我们希望在游戏中通过WASD来控制主角John运动,思路如下:
(1) 获取按键输入(WASD)。
(2) 根据输入,进行角色运动的相关参数设置和计算(移动向量和旋转四元数)。
(3) 在播放动画的时候,根据上边的计算结果来移动和旋转角色。
可能会涉及一些中学的向量知识和逻辑运算(与、或、非)。
2 脚本编写
(1) 声明变量
声明变量有点像王师傅做菜的第一步,把各种要用到的材料和工具等先说明准备好。我们需要使用某些组件或者某些参数的时候,一般会用变量把它们先“装”起来,给它们起一个名字。“=”可用于给变量赋值,“//”后边是注释,解析代码含义。这样理解就行:“//”后面的内容是给人看的,而不是给机器看的。
格式:变量类型 变量名;
常用变量类型:暂时了解即可。
float:单浮点数,暂时可以理解为精度较低的小数。
bool:只有真(true) 和假(false)。
例子:float speed; 可以理解为一个叫speed的小数变量。
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float turnSpeed = 20f;//旋转速度
Animator m_Animator;
Rigidbody m_Rigidbody; //刚体
Vector3 m_Movement; //移动向量
Quaternion m_Rotation = Quaternion.identity;//旋转四元数
(2) 相关逻辑运算
方法:可以理解为类似于王师傅做菜时切小块,加宽油等处理材料的手段或者方法,在这里使处理数据信息的方法。
格式:
返回值类型 方法名()
{
方法内容;
}
Start()方法只在初始化的时候执行一次,FixedUpdate()在游戏过程中每一个物理帧执行一次。再次温馨提示,标点符号记得要用英文输入法哦~
代码:
①在开始时获取组件,这些组件我们在上一篇中已经添加到John的预制体里了。void表示这个方法不用返回值。
void Start()
{
//获取组件
m_Animator = GetComponent<Animator>(); //获取Animator组件
m_Rigidbody = GetComponent<Rigidbody>();//获取Rigidbody组件
}
②获取按键输入并且根据输入进行处理运算。
void FixedUpdate()
{
//获取按键输入
float horizontal = Input.GetAxis("Horizontal"); //水平输入AD键
float vertical = Input.GetAxis("Vertical"); //竖直输入WS键
//根据输入设置移动向量
m_Movement.Set(horizontal, 0f, vertical);//(X,Y,Z)轴
m_Movement.Normalize(); //转化为单位向量,表示移动方向
//根据输入判断是否在行走
bool hasHorizontalInput = !Mathf.Approximately(horizontal, 0f);//是否有水平输入(根据输入是否等于0)
bool hasVerticalInput = !Mathf.Approximately(vertical, 0f); //是否有竖直输入(根据输入是否等于0)
bool isWalking = hasHorizontalInput || hasVerticalInput; //如果有水平或者竖直输入,则判断为在行走。"||"或。
//设置动画参数
m_Animator.SetBool("IsWalking", isWalking);//与上一篇的过渡条件参数对应
//旋转相关
Vector3 desiredForward = Vector3.RotateTowards
(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);//(现在前方向量,目标方向向量,角速度,向量大小变化)
m_Rotation = Quaternion.LookRotation(desiredForward); //设置旋转四元数,暂时理解为旋转方法要用的参数
}
(3) 移动和旋转角色
//当播放动画的时候,调用Rigidbody(刚体)控制角色运动
private void OnAnimatorMove()
{
//移动
m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);
//旋转
m_Rigidbody.MoveRotation(m_Rotation);
}
}
编辑完之后CTRL+S保存脚本。
3 添加脚本到JohnLemon预制体
回到Unity,在Hierarchy窗口中选中JohnLemon,Inspector视窗里点击Prefab>Open打开预制体。把Assets>Scripts文件夹里的PlayerMovement脚本拖到Inspector窗口里,完成后退出编辑预制体。

现在我们就可以CTRL+P运行游戏,通过WASD控制JohnLemon移动了,赶紧试试吧~

结语:不知道有多少小伙伴坚持完这一关呢?这一节我们为John添加了脚本,成功地控制它运动。没有编程基础的小伙伴也许会一头雾水,这是正常现象,因为体验过游戏制作的流程后,C#基础还是需要踏踏实实地补回来。下一篇我们将会为游戏添加关卡以及调节光照。

迫不及待想自行开始制作的小伙伴,可以浏览John Lemon's Haunted Jaunt官方教程:
https://learn.unity.com/project/john-lemon-s-haunted-jaunt-3d-beginner
学有余力的小伙伴,如果想更加系统地了解C#基础,可以参考以下C#编程基础视频:皮皮关做游戏
咱们的游戏开发交流群也欢迎强势插入:869551769
希望参与线下游戏开发学习的,欢~~~~~~迎访问:http://levelpp.com/