三、角色控制器

这一节内容的主要目的创建一个角色模板,并通过脚本完成对角色运动的控制。

最终成果

暂时无法在飞书文档外展示此内容

最终代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    public float moveSpeed = 7f;//这个会在unity编辑器中增加一个move speed的输入框方便控制角色移动的速度。

//注意Update的首字母必须大写,相关的学习笔记在飞书中可以找到
 private void Update(){
    //声明一个2维向量,初始值为(0,0),x的值为0,y的值为0.
    Vector2 inputVector = new Vector2(0,0);
    //键入W
    if (Input.GetKey(KeyCode.W)){
       inputVector.y = +1;//当键入W时,向量中的y值+1
    }
    //键入A
     if (Input.GetKey(KeyCode.A)){
        inputVector.x = -1;//当键入A时,向量中的x值-1
    }
    //键入S
     if (Input.GetKey(KeyCode.S)){
        inputVector.y = -1;//当键入S时,向量中的y值-1
    }
    //D
     if (Input.GetKey(KeyCode.D)){
        inputVector.x = +1;//当键入A时,向量中的x值-1
    }

    inputVector = inputVector.normalized;//向量归一,在飞书文档中给出了详细的解释。

    Vector3 moveDir = new Vector3(inputVector.x, 0f, inputVector.y);//将原来二维向量中的xy的值分别赋予给三维向量中的x和z,y值为0.
    //transform 访问某个东西
    transform.position += moveDir * moveSpeed * Time.deltaTime;//跟transform.position = transform.position + moveDir是一个意思。 乘以Time.deltaTime是渲染一帧需要的时间。避免帧数较高时,角色跑到屏幕外找不到角色位置。

}
}

如何创建角色

基本原则:将游戏角色对象的逻辑和视觉效果分开。

在场景中创建角色对象(胶囊)

  3D Object 👉 Capsule

但由于视觉和逻辑方面的差异,

正确创建角色的方法是:

  1. 先创建一个空对象(Creat Empty)并将其命名为“Player”
  2. 修改空对象“player”的Position属性为0-0-0
  3. 在空对象下创建一个胶囊
  4. 修改胶囊的缩放和坐标使其合适
  5. 我们的逻辑部分将赋予给空对象player,视觉部分将赋予给空对象下的胶囊。

利用这种方法创建角色的好处:

因为空对象的坐标中心和缩放没有改变,在未来控制空对象(角色)时,逻辑更简单。

未来我们将所有的逻辑组件都放置在空对象的上,而在其子集的胶囊上替换我们想要的任一视觉效果。

创建角色脚本

  1. 在Assets根目录下创建一个名为Scripts的文件夹用于存放脚本文件;
  2. 在Scripts下创建一个C#的文件,修改文件名为“Player”;
  3. 选择场景中的Player对象并将刚刚创建的C#文件拖入他的属性栏(Inspector 检查)中;
  4. 双击打开“player”C#文件,即可在vscode中打开并进行编辑工作。

角色代码编写过程及解释

关于每一步代码在做一件什么事情的详细分解可以查看我的复习文章:控制角色的移动

因为我还没有C#的基础,所以会遇到很多不懂或不认识的,比如这里的第一个词“private”。这个时候可以在微软官方文档中去查询:

private 关键字 – C# 参考 – C#

void 表示这是一个没有返回值的方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
//注意Update的首字母必须大写
 private void Update(){
//private 是访问器,表示私有访问。与之对应的还是piblic,从技术上来讲,可以省略访问器的编写。
 }
}

GetKey和GetKeyDown、GetKeyUp的区别

public class Player : MonoBehaviour
{
//注意Update的首字母必须大写,相关的学习笔记在飞书中可以找到
 private void Update(){
    Input.GetKey(KeyCod.W)
    //用于检查某个按键是否被按下
    //getkey和getkeyDown的区别
    /*1.GetKey():当通过你所指定的按键被用户按住时返回true,记住!是按住,就是长按的意识,比如你想控制角色在你按住方向键时移动,那么就是用GetKey()
        2.GetKeyDown():当通过你所按下指定名称的按键时的那一帧时返回true,记住!是那一帧,就一下的事情,不管你按多久,只是在你按下的那一瞬间
        3.GetKeyUp():在通过你释放(按键弹起时)给定名字的按键的那一帧返回true,记住!是那一帧,就一下的事情。
        ————————————————
        版权声明:本文为CSDN博主「努力的小学弟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
        原文链接:https://blog.csdn.net/weixin_38778769/article/details/103443780*/
 }
}

测试脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
 private void Update(){
 //这个if语句表示当用户键入w时会在unity中的console界面显示pressing!否则则显示“-”(破折号)
    if (Input.GetKey(KeyCode.W)){
        Debug.Log("pressing!");
    }else{
        Debug.Log("-");
    }
}

向量归一化(normalized)

https://zhuanlan.zhihu.com/p/200950355

让斜45度角易懂的速度跟水平移动或垂直移动时的速度保持一致。

Vector2()函数有两个参数x和y,当我们按下键盘方向键的时候,给到它们的值肯定是:-1,0,1其中的一个。所以,就是给了一个单位向量。如:

  • 向右移动(方向键右):Vector.x += 1, Vector(1, 0)
  • 向下移动(方向键下):Vector.y += 1,Vector(0, 1)
  • 向右下移动(方向键右+下):Vectory.x +=1 and Vectory.y += 1,Vector(1, 1)

向右移动时,x轴上,点(1,0)就是给予的值。这时向量和距离相等,都是1。因为距离就是从原点(0, 0)出发到指定点(1, 0)的直线距离。

所以,如果同时按下右和下,(1, 1)就是目标位置,距离即为根号2。

所以当按下右和下,向右下角移动时,速度会比水平或垂直移动要快。

normalized函数就是将距离归1,将根号2变为1,让它保持与水平和垂直的移动距离相等。这样,其实给予的向量是(0.707107, 0.707107)。

避免角色移动到屏幕外找不到角色的位置moveDir * Time.deltaTime

moveDir * Time.deltaTime:代表时间增量,即从上一帧渲染到当前帧所需的时间,这个值是动态变化的。

 transform.position += moveDir * Time.deltaTime;//确保移动的位置跟屏幕帧率无关。

拓展

新的输入(控制)管理器

本课程暂时用到的是传统输入管理器。Cede monkey 提供了一个新的输入管理器扩展包的开发教程。

How to use New Input System Package

https://www.youtube.com/watch?v=Yjee_e4fICc

Public和Private怎么选

为什么不应该把所有的参数暴露出来。

https://www.youtube.com/watch?v=pD27YuJG3L8

C#入门

Code monkey为这个游戏开发的教程配套了C#入门课程,但由于我的英文不好,所以我重新找了中文课程,具体如下:

Code monkey C#入门教程

https://www.youtube.com/watch?v=IFayQioG71A

刘铁猛《C#语言入门详解》全集

https://www.bilibili.com/video/BV13b411b7Ht/?spm_id_from=333.788.top_right_bar_window_history.content.click&vd_source=0f636f173a0a5855cca528319972bfe9

我试着看过几集这个教程,感觉适合有一些基本的编程基础的同学,不太适合像我这种以前完全没有接触过任何编程知识的人。

优点:
  1. 课程比较成体系,涉及到很多原理性的知识,帮助你知其然且知其所以然
缺点:
  1. 年份较老
  2. 前面讲了很多原理性的内容,看到第四集的时候就有点看不太懂或看不下去了。

(个人推荐)丑萌气质狗《C#零基础入门教程 Visual Studio 2022》

https://www.bilibili.com/video/BV1NA4y1R7vL?p=1&vd_source=0f636f173a0a5855cca528319972bfe9

通俗易懂,快速进入到具体的C#语言的编写过程中。基本上学到第11、12节课的时候,就能开始回到code monkey的unity游戏开发教程中去了。比较容易坚持下去,后续再一边进行游戏开发的学习和C#知识内容的学习和补充。

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注