8511人加入学习
(66人评价)
Unity最全最完整的零基础入门教程-Luna's Fantasy(露娜的大冒险)

制作完成于2023年8月1日,基于Unity2023.1.1

价格 免费

层级:

可以在2D游戏物体中的SpriteRenderer和地形TilemapRederer组件中的Order in layer 属性中去设置层级大小,值越大,越后渲染,反之,越先渲染,值大的物体会覆盖值小的物体。

[展开全文]

访问级别(Access Level):访问级别是指定了一个类型或类型成员对于其他代码是否可见和可访问的规则。

访问修饰符(Access Modifiers):访问修饰符是一种关键字,用于在声明类型或成员时指定其访问级别。访问修饰符告诉编译器谁可以访问该成员或类型。

1. public:`都是可见和可访问的。这意味着它可以在任何地方访问,包括其他类和程序集。在Unity中,如果将成员变量声明为 `public`,它将在Inspector面板中显示,允许你在编辑器中对其进行调整。public` 访问修饰符表示成员或类型对于所有代码

2. private:`private` 访问修饰符表示成员只能在当前类内部访问。其他类无法直接访问私有成员。这是一种封装的方式,用于隐藏内部实现细节。

3. **protected:** `protected` 访问修饰符表示成员对于当前类及其派生类是可见和可访问的。这通常用于继承关系中,允许派生类访问基类的一些成员。

[展开全文]
  1. private Rigidbody2D rigidbody2d;
    这一行声明了一个私有的Rigidbody2D类型的变量`rigidbody2D`,它将用于引用游戏对象上的Rigidbody2D组件。
  2. rigidbody2d = GetComponent<Rigidbody2D>();
    这一行通过调用`GetComponent<Rigidbody2D>()`方法来获取游戏对象上的Rigidbody2D组件,并将其赋值给前面声明的`rigidbody2D`变量。这样,就可以在后续代码中使用`rigidbody2D`来访问和操作Rigidbody2D组件。
  3. rigidbody2d.MovePosition(position);
    这一行使用Rigidbody2D的`MovePosition`方法来移动游戏对象到指定的位置`position`。`position`是一个Vector2类型的变量,用于指定游戏对象应该移动到的目标位置。

 

在编程中,静态方法和普通方法是两种不同类型的方法,它们在定义、调用和用途上有一些重要的区别。

普通方法(Instance Methods):

1. 定义:普通方法是属于对象实例的,它们需要通过对象实例来调用。每个对象实例都有自己的一组普通方法。

2. 调用:要调用普通方法,必须首先创建类的一个对象实例,然后使用该实例来调用方法。

3. 用途:普通方法通常用于对象的状态和属性,它们可以访问和修改对象的字段、属性和成员变量。这些方法可以对特定对象执行操作。

4. 示例:

GetComponent方法(普通方法):Start方法中,GetComponent方法,它是一个普通方法。它需要在游戏对象实例上调用,并通过对象实例来获取组件。获取一个Rigidbody2D组件并将其分配给了rigidbody2d变量。

rigidbody2d = GetComponent<Rigidbody2D>();

静态方法(Static Methods):

1. 定义:静态方法是属于类本身的,它们不依赖于类的对象实例。可以直接通过类名称来调用静态方法。

2. 调用:静态方法可以直接使用类名称来调用,而无需创建对象实例。

3. 用途:静态方法通常用于不需要访问对象状态的操作,或者在多个对象实例之间共享相同行为的操作。它们可以用于工具方法、数学函数、单例模式等场景。

4. 示例:

Input.GetAxis方法(静态方法):Update方法中,使用了Input.GetAxis方法,它是一个静态方法。可以直接使用Input类的名称来调用该方法,而无需创建Input类的对象实例。

float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");

 

[展开全文]

刚体组件(Rigidbody)和碰撞器组件(Collider)是与物理模拟和碰撞检测相关的两个关键组件。

刚体组件(Rigidbody):

作用:刚体组件是用于使游戏对象具有物理性质的组件。它可以赋予游戏对象质量、重力、速度和角速度,从而让游戏对象在物理世界中进行模拟和交互。

重要属性和功能:

  •    - 质量(Mass): 定义了物体的质量,影响其惯性和受力响应。
  •    - 速度(Velocity):控制物体的线性运动。
  •    - 角速度(Angular Velocity):控制物体的旋转运动。
  •    - 受力和扭力(Force & Torque):可以通过脚本为刚体施加外力和扭力。
  •    - 重力(Gravity):控制是否受到全局重力影响。

用途:刚体通常用于模拟物体的真实物理行为,如角色控制、物体的弹跳、飞行物体、车辆模拟等。它使游戏对象能够与物理引擎交互,响应力和碰撞。

碰撞器组件(Collider):

1. 作用:碰撞器组件用于定义游戏对象的碰撞形状,使其具备碰撞检测和响应功能。碰撞器不具有物理性质,仅用于检测碰撞。

2. 重要属性和功能:

  •    - 形状类型(Shape Type):Unity提供了多种碰撞器形状类型,包括BoxCollider、SphereCollider、CapsuleCollider、MeshCollider等。
  •    - 触发器(Is Trigger):碰撞器可以设置为触发器,这意味着它不会导致物理反应,而只会发出触发事件。
  •    - 碰撞事件(Collision Events):可以通过脚本来处理碰撞事件,例如OnCollisionEnter、OnCollisionStay和OnCollisionExit。

3. 用途:碰撞器用于检测游戏对象之间的碰撞,从而触发事件或执行特定的逻辑。它们通常用于处理游戏中的碰撞、触发、物体交互等情况。

[展开全文]

在Unity中,预制体(Prefab)是一种非常有用的功能,用于创建和重用游戏对象的模板。预制体允许你定义一个游戏对象,然后在场景中多次实例化它,以便在不同地方使用相同的配置。

  1. 预制体的创建:你可以通过将一个或多个游戏对象放入场景中,然后将它们拖放到项目视图中的文件夹中,从而创建预制体。这将在项目中创建一个.prefab文件,它将保存游戏对象的所有属性、组件和子对象的配置。
  2. 实例化预制体:一旦你创建了预制体,你可以在场景中的任何位置实例化它。这意味着你可以多次在游戏中使用相同的游戏对象配置,而无需手动创建每个实例。
  3. 修改预制体:预制体允许你在需要时修改它们的属性、组件或子对象。当你编辑预制体时,所有基于该预制体的实例都会自动反映这些更改。
  4. 变种(Variants):Unity还引入了预制体变种的概念,允许你创建与预制体相关的可配置选项。这些变种可以让你在不同情况下使用同一预制体的不同配置。

[展开全文]

渲染顺序与层级设置

在Unity中,通过使用层级(Layer)和渲染顺序(Order in Layer)属性,可以控制2D游戏物体的渲染顺序,以实现覆盖效果和深度感。

层级(Layer)

在Unity中,层级用于将2D游戏物体分组并定义它们的渲染顺序。每个游戏物体都可以分配到一个特定的层级中,层级之间可以有优先级。

  • - 值越大,表示在同一层级中的游戏物体越后渲染。
  • - 值越小,表示在同一层级中的游戏物体越先渲染。

通过调整层级,可以控制哪些游戏物体在视图中处于前景,哪些在背景,以及它们之间的渲染顺序。

渲染顺序(Order in Layer)

`Order in Layer` 属性用于在特定层级中定义游戏物体的渲染顺序。这个属性的值决定了游戏物体在同一层级内的渲染顺序。

  • - 值越大,游戏物体越后渲染,覆盖值小的物体。
  • - 值越小,游戏物体越先渲染,出现在值大的物体前面。

通过调整 `Order in Layer` 属性,你可以微调游戏物体的渲染顺序,以实现精确的覆盖效果和深度感。

使用层级和渲染顺序的场景

  1. 2D平台游戏:在一个2D平台游戏中,可以使用不同的层级来分别管理地面、角色、障碍物等元素的渲染顺序,以确保角色在正确的位置显示。
  2. 卡牌游戏:在卡牌游戏中,每张卡片可以分配到不同的层级和渲染顺序,以便它们可以重叠和显示在合适的位置。
  3. 背景和前景元素:在一个场景中,可以将背景元素放置在较低的层级,并设置合适的渲染顺序,以确保它们位于前景元素之后。

通过使用层级和渲染顺序,可以有效地管理游戏中不同元素的渲染,创造出更丰富和复杂的视觉效果。这对于2D游戏的设计和视觉表现非常重要。

[展开全文]

改变帧率

Application.targetFrameRate = 60;
  • 这行代码用于设置游戏的目标帧率为60帧每秒。这意味着游戏将尽力在每秒渲染60帧画面,以实现更流畅的动画和交互。
[展开全文]

使用Input.GetAxis()移动游戏对象
 

void Update()
{
    // 获取水平和垂直输入值
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");

    // 获取游戏对象的当前位置
    Vector2 position = transform.position;

    // 使用输入值来修改位置
    position.x = position.x + 2.5f * horizontal * Time.deltaTime;
    position.y = position.y + 2.5f * vertical * Time.deltaTime;

    // 将新的位置应用到游戏对象
    transform.position = position;
}

获取输入值

float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");

- 这两行代码用于获取水平和垂直输入值。`Input.GetAxis()` 方法用于获取输入轴的值,根据传入的参数来选择特定的输入轴。在这里,我们分别获取了水平和垂直方向上的输入值。

修改位置

position.x = position.x + 2.5f * horizontal * Time.deltaTime;
position.y = position.y + 2.5f * vertical * Time.deltaTime;

- 这两行代码使用获取到的输入值来修改游戏对象的位置。水平输入值(`horizontal`)用于控制水平移动,垂直输入值(`vertical`)用于控制垂直移动。
- 乘以 `2.5f` 用于调整移动速度。你可以根据需要调整此值来控制移动速度。
- `Time.deltaTime` 用于考虑到每帧的时间间隔,以使移动操作平滑,不受帧率的影响。

[展开全文]

在代码中,`f` 是一个后缀,用于将数值文字(literal)标记为浮点数(float literal)。在C#中,编译器默认将小数点后的数字视为`double`类型,而不是`float`类型。为了明确告诉编译器这是一个`float`类型的值,我们可以在数值后面加上`f`后缀。

例如,`0.1f` 表示一个`float`类型的值,而 `0.1`(没有`f`后缀)将被视为`double`类型的值。

在Unity中,通常使用`float`类型来表示位置、旋转、缩放等变换信息,因为这些信息的精度通常不需要太高。因此,在修改坐标值时,使用`0.1f` 表示0.1个浮点数单位的增量,这是一种常见的做法。

新手之跃宝箱密码:b

[展开全文]

获取"Luna"的位置

Vector2 position = transform.position;

在这一行代码中,我们首先声明了一个名为`position`的`Vector2`类型的变量,这个变量将用于存储"Luna"游戏对象的位置信息。

通过`transform.position`,我们获取到了"Luna"游戏对象的当前位置,并将其赋值给了`position`变量。这意味着`position`现在包含了"Luna"的当前位置(包括X和Y坐标)。

修改位置变量

position.x = position.x + 0.1f; // 让人物“Luna”向右进行移动

在这一行代码中,我们修改了`position`变量的X坐标,以实现"Luna"向右移动。具体来说,我们将`position`的X坐标增加了0.1个单位,这会使"Luna"在X轴方向上向右移动一小段距离。

 重新赋值位置

transform.position = position; // 把位置再重新赋值


最后一行代码是将修改后的`position`变量的值重新赋给了"Luna"游戏对象的位置。这意味着我们的移动操作已经生效,"Luna"的位置被更新,游戏对象在画面上发生了实际的位移。

  • 如果你发现"Luna"一直在移动,通常是因为代码中的移动逻辑被放在了 Update() 方法中,而 Update() 方法会在每一帧都被调用,所以移动操作会一直执行。这可能不是你想要的行为,特别是如果你只想让"Luna"移动一次或在某个条件下移动。

 

[展开全文]

什么是变量?

在计算机编程中,变量就像一个命名的盒子,用来存储数据。这个盒子有一个名字,你可以通过这个名字来访问里面的内容。

举个例子: 假设你有一个盒子,名字叫`treasureBox`。你可以把一些贵重的物品放进这个盒子里,然后通过`treasureBox`这个名字来找到和取出这些物品。在编程中,变量就像这个`treasureBox`,是用来存储数据的容器。

声明变量

在代码中,声明一个变量的过程就是创建一个盒子,然后给这个盒子起一个名字。下面是一个示例:
 

Vector2 position;

在这里,我们声明了一个名为`position`的变量。这告诉计算机在内存中为`position`分配适当的空间,以便存储一个`Vector2`类型的值。

变量类型

变量类型告诉计算机我们要存储哪种类型的数据,以便计算机可以为变量分配正确大小的内存空间。在这里,`Vector2`是一种特殊的数据类型,用于存储包含两个数字的值,通常用于表示二维坐标,包括X和Y坐标。

赋值操作符

position = transform.position;

在这行代码中,我们使用了赋值操作符`=`。它的作用是将右侧的值(`transform.position`)赋给左侧的变量(`position`)。这意味着我们将"Luna"游戏对象的位置信息赋给了`position`变量,就像将一个物品放入了`treasureBox`盒子中一样。

[展开全文]

探索基础脚本结构

 了解基本结构

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

public class NewBehaviourScript : MonoBehaviour
{
    void Start()
    {
        // 在游戏开始时执行的代码
    }

    void Update()
    {
        // 在每一帧更新时执行的代码
    }
}

命名空间与引用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
  1. - `using` 关键字用于引入命名空间,让我们可以使用其中的类和方法。
  2. - `System.Collections` 和 `System.Collections.Generic` 命名空间提供了许多集合类(如列表、字典等)。
  3. - `UnityEngine` 包含了许多Unity引擎的核心功能。

类定义

public class NewBehaviourScript : MonoBehaviour

- `public` 表示这个类是公共的,可以在其他脚本中访问。
- `class` 关键字表示这是一个类。
- `NewBehaviourScript` 是类的名称,可以根据需要进行更改。
- `: MonoBehaviour` 表示这个类继承自`MonoBehaviour`类,这是Unity所有脚本的基类。

Start() 方法

void Start()
{
    // 在游戏开始时执行的代码
}

- `void` 表示这个方法不返回任何值。
- `Start()` 是一个特殊的方法,在游戏开始时执行一次。

Update() 方法
 

void Update()
{
    // 在每一帧更新时执行的代码
}

- `Update()` 也是一个特殊方法,它在每一帧都会被调用。

 

新手之跃宝箱密码:X

[展开全文]

Input.GetAxis()的参数是Input Manager里面的

[展开全文]

Input用于监听对象

Input.GetAxis("监听对象")

[展开全文]

双方都要有碰撞器且一方有刚体且最好是运动方

[展开全文]