探索Unity游戏开发中的生命周期函数(二)

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

探索Unity游戏开发中的生命周期函数(二)
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 Unity 生命周期函数

为初学者节省宝贵的学习时间,避免困惑!


深入探索Unity游戏开发中的生命周期函数(一)
深入探索Unity游戏开发中的生命周期函数(二)
深入探索Unity游戏开发中的生命周期函数(三)
深入探索Unity游戏开发中的生命周期函数(四)


TechX 教程效果:

在这里插入图片描述



四、、Input Event

1、OnMouseEnter


OnMouseEnter() 是 Unity 中用于处理鼠标进入游戏对象区域的一个回调函数。当鼠标指针进入一个具有碰撞体(Collider)组件的游戏对象区域时,Unity 就会自动调用这个函数。这个函数通常用于响应与鼠标交互相关的事件,比如在鼠标悬停在一个对象上时改变其外观或执行特定的操作。

  1. 函数签名:

void OnMouseEnter()

  1. 函数说明:
  • OnMouseEnter() 是 MonoBehaviour 类的一个成员函数,因此需要在继承自 MonoBehaviour 的脚本中进行实现。
  • 该函数在鼠标进入对象的碰撞体区域时被调用,标志着鼠标进入事件的发生。
  • OnMouseEnter() 只能用于具有碰撞体组件(例如 Collider、Collider2D)的 3D 或 2D 游戏对象,以及 UI 元素。
  • 由于鼠标事件只在游戏运行时有效,该函数也只在游戏运行时调用。
  1. 使用示例:

假设你有一个 3D 游戏对象,你想在鼠标进入该对象区域时改变它的颜色。以下是一个示例脚本的代码:

using UnityEngine;

public class MouseEnterExample : MonoBehaviour
{
    private Renderer renderer;

    private void Start()
    {
        // 获取游戏对象的渲染器组件
        renderer = GetComponent<Renderer>();
    }

    // 鼠标进入事件
    private void OnMouseEnter()
    {
        // 更改游戏对象的材质颜色为红色
        renderer.material.color = Color.red;
    }
}

2、OnMouseExit


OnMouseExit() 是 Unity 中用于处理鼠标离开游戏对象区域的一个回调函数。当鼠标指针离开一个具有碰撞体(Collider)组件的游戏对象区域时,Unity 就会自动调用这个函数。类似于 OnMouseEnter(),这个函数通常用于响应与鼠标交互相关的事件,比如在鼠标离开对象时恢复其外观或执行特定的操作。

  1. 函数签名:

void OnMouseExit()

  1. 函数说明:
  • OnMouseExit() 是 MonoBehaviour 类的一个成员函数,因此需要在继承自 MonoBehaviour 的脚本中进行实现。
  • 该函数在鼠标离开对象的碰撞体区域时被调用,标志着鼠标离开事件的发生。
  • OnMouseExit() 只能用于具有碰撞体组件(例如 Collider、Collider2D)的 3D 或 2D 游戏对象,以及 UI 元素。
  • 由于鼠标事件只在游戏运行时有效,该函数也只在游戏运行时调用。
  1. 使用示例:
using UnityEngine;

public class ChangeColorOnMouseEnter : MonoBehaviour
{
    private Color originalColor;
    public Color highlightColor = Color.red;

    private void Start()
    {
        originalColor = GetComponent<Renderer>().material.color;
    }

    private void OnMouseEnter()
    {
        GetComponent<Renderer>().material.color = highlightColor;
    }

    private void OnMouseExit()
    {
        GetComponent<Renderer>().material.color = originalColor;
    }
}

3、OnMouseDown


在Unity中,OnMouseDown是一个生命周期函数,用于处理鼠标按下按钮时的事件。当鼠标按下按钮时,Unity会自动调用该函数。

以下是关于OnMouseDown生命周期函数的详细介绍:

  1. 函数签名:
void OnMouseDown()
  1. 触发时机:
  • 当鼠标按下按钮时并且按钮在被碰撞器(Collider)范围内时,该函数被触发。
  1. 执行流程:
  • 当触发鼠标按下事件时,Unity会自动调用OnMouseDown函数,并在主线程中执行函数中的代码。
  1. 函数类型:
  • OnMouseDown函数是一个无返回值的函数,因此不需要在函数体中进行return语句。
  1. 使用场景:
  • OnMouseDown函数常用于实现与鼠标点击交互相关的功能,比如点击按钮执行特定行为、点击物体进行拖拽等。
  1. 使用方法: 为了使用OnMouseDown函数,你需要按照以下步骤进行设置:
  • 在游戏对象身上添加一个碰撞器(Collider)组件。常用的有Box Collider、Sphere Collider等。
  • 在游戏对象的脚本中,编写一个名为OnMouseDown的函数。
  • 在OnMouseDown函数中,编写你希望执行的代码逻辑。比如,你可以在此函数中检测鼠标点击的位置、执行特定的行为等。

以下是一个示例代码:

using UnityEngine;

public class MouseDownExample : MonoBehaviour
{
    private Rigidbody rigidBody;

    private void Start()
    {
        // 获取游戏对象的刚体组件
        rigidBody = GetComponent<Rigidbody>();
    }

    // 鼠标点击事件
    private void OnMouseDown()
    {
        // 根据鼠标点击的位置添加力使物体向上跳跃
        Vector3 jumpForce = new Vector3(0, 5, 0);
        rigidBody.AddForce(jumpForce, ForceMode.Impulse);
    }
}

在上述示例中,我们给一个游戏对象添加了一个碰撞器(Collider)组件,并编写了一个名为OnMouseDown的函数。当鼠标按下按钮并且按钮在游戏对象的范围内时,物体将向上跳跃。

4、OnMouseUp


在Unity中,OnMouseUp是一个生命周期函数,用于处理鼠标释放按钮时的事件。当鼠标释放按钮时,Unity会自动调用该函数。

以下是关于OnMouseUp生命周期函数的详细介绍:

  1. 函数签名:
void OnMouseUp()
  1. 触发时机:
  • 当鼠标释放按钮时并且按钮在被碰撞器(Collider)范围内时,该函数被触发。
  1. 执行流程:
  • 当触发鼠标释放事件时,Unity会自动调用OnMouseUp函数,并在主线程中执行函数中的代码。
  1. 函数类型:
  • OnMouseUp函数是一个无返回值的函数,因此不需要在函数体中进行return语句。
  1. 使用场景:
  • OnMouseUp函数常用于实现与鼠标点击交互相关的功能,与OnMouseDown相对应。它可以用于响应鼠标点击结束后的行为,比如判断点击事件是否成功、执行释放按钮后的特定操作等。
  1. 使用方法:为了使用OnMouseUp函数,你需要按照以下步骤进行设置:
  • 在游戏对象身上添加一个碰撞器(Collider)组件。常用的有Box Collider、Sphere Collider等。
  • 在游戏对象的脚本中,编写一个名为OnMouseUp的函数。
  • 在OnMouseUp函数中,编写你希望执行的代码逻辑。比如,你可以在此函数中检测鼠标释放的位置、执行特定的行为等。

以下是一个示例代码:

using UnityEngine;

public class MouseUpExample : MonoBehaviour
{
    private Collider collider;

    private void Start()
    {
        // 获取游戏对象的碰撞器组件
        collider = GetComponent<Collider>();
    }

    // 鼠标释放事件
    private void OnMouseUp()
    {
        // 判断鼠标释放的位置是否在碰撞器范围内
        if (collider.bounds.Contains(Input.mousePosition))
        {
            Debug.Log("Clicked inside the collider!");
        }
        else
        {
            Debug.Log("Clicked outside the collider!");
        }
    }
}

在上述示例中,我们给一个游戏对象添加了一个碰撞器(Collider)组件,并编写了一个名为OnMouseUp的函数。当鼠标释放按钮并且按钮在游戏对象的范围内时,会输出相应的日志信息。

5、OnMouseDrag


在Unity中,OnMouseDrag是一个生命周期函数,用于处理鼠标拖拽的事件。当鼠标按下按钮并移动时,Unity会自动调用该函数。

以下是关于OnMouseDrag生命周期函数的详细介绍:

  1. 函数签名:
void OnMouseDrag()
  1. 触发时机:
  • 当鼠标按下按钮并且按钮在被碰撞器(Collider)范围内时,该函数被触发。随后,当鼠标保持按下状态并移动时,OnMouseDrag函数会持续被调用。
  1. 执行流程:
  • 当OnMouseDrag函数被触发后,Unity会持续调用该函数,并在主线程中执行函数中的代码。
  1. 函数类型:
  • OnMouseDrag函数是一个无返回值的函数,因此不需要在函数体中进行return语句。
  1. 使用场景:
  • OnMouseDrag函数常用于实现与鼠标拖拽交互相关的功能。通过在该函数中编写代码逻辑,可以实现物体的拖拽、移动等操作。
  1. 使用方法:为了使用OnMouseDrag函数,你需要按照以下步骤进行设置:
  • 在游戏对象身上添加一个碰撞器(Collider)组件。常用的有Box Collider、Sphere Collider等。
  • 在游戏对象的脚本中,编写一个名为OnMouseDrag的函数。
  • 在OnMouseDrag函数中,编写你希望执行的代码逻辑。比如,你可以在此函数中根据鼠标移动的距离来移动物体。

以下是一个示例代码:

using UnityEngine;

public class MouseDragExample : MonoBehaviour
{
    private Vector3 offset;

    // 鼠标按下事件
    private void OnMouseDown()
    {
        // 计算鼠标点击位置与物体中心点的偏移量
        offset = transform.position - Camera.main.ScreenToWorldPoint(Input.mousePosition);
    }

    // 鼠标拖拽事件
    private void OnMouseDrag()
    {
        // 根据鼠标移动的位置调整物体的位置
        transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition) + offset;
    }
}

在上述示例中,我们编写了一个名为OnMouseDrag的函数,在该函数中,我们将物体跟随鼠标移动的位置进行移动。

6、OnMouseOver


在Unity中,OnMouseOver是一个生命周期函数,用于处理鼠标悬停的事件。当鼠标光标悬停在一个游戏对象上时,Unity会自动调用该函数。

以下是关于OnMouseOver生命周期函数的详细介绍:

  1. 函数签名:
void OnMouseOver()
  1. 触发时机:
  • 当鼠标光标悬停在一个具有碰撞器(Collider)组件的游戏对象上时,OnMouseOver函数被触发。在悬停期间,该函数会持续被调用。
  1. 执行流程:
  • 当OnMouseOver函数被触发后,Unity会持续调用该函数,并在主线程中执行函数中的代码。
  1. 函数类型:
  • OnMouseOver函数是一个无返回值的函数,因此不需要在函数体中进行return语句。
  1. 使用场景:
  • OnMouseOver函数常用于实现与鼠标悬停交互相关的功能。通过在该函数中编写代码逻辑,可以实现对悬停对象的检测、显示信息、变色等操作。
  1. 使用方法:为了使用OnMouseOver函数,你需要按照以下步骤进行设置:
  • 在游戏对象身上添加一个碰撞器(Collider)组件。常用的有Box Collider、Sphere Collider等。
  • 在游戏对象的脚本中,编写一个名为OnMouseOver的函数。
  • 在OnMouseOver函数中,编写你希望执行的代码逻辑,比如改变材质颜色、显示提示信息等。
    以下是一个示例代码:
using UnityEngine;

public class MouseOverExample : MonoBehaviour
{
    private Renderer renderer;
    private Color originalColor;

    private void Start()
    {
        // 获取游戏对象的渲染器组件
        renderer = GetComponent<Renderer>();
        // 记录原始材质颜色
        originalColor = renderer.material.color;
    }

    // 鼠标悬停事件
    private void OnMouseOver()
    {
        // 改变游戏对象材质的颜色
        renderer.material.color = Color.red;
    }

    // 鼠标离开事件
    private void OnMouseExit()
    {
        // 恢复游戏对象材质的原始颜色
        renderer.material.color = originalColor;
    }
}

在上述示例中,我们给一个游戏对象添加了一个碰撞器(Collider)组件,并编写了一个名为OnMouseOver的函数。当鼠标光标悬停在对象上时,会改变对象的颜色为红色;当鼠标离开时,恢复对象的原始颜色。

7、OnMouseUpAsButton


当鼠标在 Unity 中悬停在一个游戏对象上并在该对象上按下鼠标按钮时,会自动调用 OnMouseUpAsButton`函数。这一函数允许你在鼠标按钮被释放时执行特定的操作。

以下是关于 OnMouseUpAsButton函数的详细介绍:

  1. 函数签名:
void OnMouseUpAsButton()
  1. 触发时机:
  • 在鼠标按钮被释放时,如果鼠标光标悬停在一个具有碰撞器(Collider)组件的游戏对象上,那么 OnMouseUpAsButton 函数会被自动触发。
  1. 执行流程:
  • 当鼠标按钮被释放时,Unity 会检查当前鼠标光标是否在一个具有碰撞器的游戏对象上。如果是,就会调用该对象上的 OnMouseUpAsButton 函数,并在主线程中执行函数中的代码。
  1. 函数类型:
  • OnMouseUpAsButton函数是一个无返回值的函数,因此不需要在函数体中进行 return 语句。
  1. 使用场景:
  • OnMouseUpAsButton 函数适用于在鼠标按钮被释放时执行某种特定操作的场景。这通常用于处理按钮点击事件、选中物体、启动动作等。
  1. 使用方法:为了使用 OnMouseUpAsButton函数,你需要按照以下步骤进行设置:
  • 在游戏对象身上添加一个碰撞器(Collider)组件,确保对象具有可被鼠标点击的区域。
  • 在游戏对象的脚本中,编写一个名为 OnMouseUpAsButton 的函数。
  • OnMouseUpAsButton 函数中,编写你希望执行的代码逻辑,比如触发按钮点击事件、切换场景等。

以下是一个示例代码:

using UnityEngine;

public class MouseClickExample : MonoBehaviour
{
    private void OnMouseUpAsButton()
    {
        // 在按钮被释放时执行的操作
        Debug.Log("Button Clicked: " + gameObject.name);

        // 触发其他操作,比如切换场景或执行动作
    }
}

在上述示例中,我们给一个游戏对象添加了一个碰撞器(Collider)组件,并编写了一个名为 OnMouseUpAsButton的函数。当鼠标按钮在对象上被释放时,会输出按钮被点击的信息,并触发其他操作。这种方式可以模拟按钮点击的效果,实现交互式的用户体验。



五、Game Logic

1、Update()


Update() 函数是一个至关重要的组成部分。在游戏运行时,Update() 函数在每一帧都会被调用,它允许你在游戏进行中处理逻辑、更新游戏状态以及响应用户输入。

以下是关于 Update() 函数的详细介绍:

  1. 函数签名:
void Update()
  1. 触发时机:
  • 在游戏运行过程中,每帧都会调用 Update() 函数。这意味着在游戏进行中,Update() 函数会被频繁地调用,通常每秒会有数十次甚至更多的调用。
  1. 游戏逻辑更新:
  • Update() 函数是处理游戏逻辑和状态更新的主要场所。你可以在其中编写代码来处理移动、碰撞检测、动画控制、玩家输入等等。由于它的高频调用,适合处理需要实时更新的逻辑。
  1. 用户输入响应:
  • 如果你需要响应玩家的输入,比如键盘按键、鼠标点击等,Update() 函数是一个很好的地方。你可以在这里检查输入状态并相应地调整游戏状态。
  1. 定时事件处理:
  • 在某些情况下,你可能需要按照一定的时间间隔来执行某些操作,比如生成敌人、产生道具等。你可以利用 Update() 函数中的计时逻辑来实现这些定时事件。
  1. 与帧率无关:
  • 需要注意的是,Update() 函数的调用次数与帧率(Frame Rate)无关。不同的硬件和游戏设置可能导致不同的帧率,但 Update() 函数每秒都会被调用多次。

示例代码:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 5.0f;

    private void Update()
    {
        // 获取玩家输入
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        // 计算移动方向
        Vector3 movement = new Vector3(horizontalInput, 0, verticalInput);

        // 根据输入更新位置
        transform.Translate(movement * speed * Time.deltaTime);
    }
}

在这个示例中,我们编写了一个简单的脚本来控制玩家对象的移动。在 Update() 函数中,我们获取玩家的输入,计算移动方向,然后更新玩家的位置。这使玩家对象能够在每一帧都根据输入移动。

总结而言,Update() 函数是Unity生命周期中的核心,允许你在每一帧都更新游戏状态、响应用户输入以及处理游戏逻辑。它是构建游戏逻辑和交互的关键部分。

2、LateUpdate()


LateUpdate() 函数是一个特殊的函数,它在 Update() 函数执行后调用,常用于处理可能在 Update() 中产生的变化以及摄像机跟随等操作。

以下是关于 LateUpdate() 函数的详细介绍:

  1. 函数签名:
void LateUpdate()
  1. 触发时机:
  • LateUpdate() 函数在每一帧的 Update() 函数执行完毕后调用,确保在 Update() 中的逻辑和变化都已经应用完毕。这使得 LateUpdate() 更适合用于处理相对于 Update() 逻辑的变化。
  1. 应用变化:
  • 由于 LateUpdate() 在 Update() 之后被调用,它是应用变化的良好时机。如果你在 Update() 中修改了对象的位置、旋转或其他属性,LateUpdate() 可以用来确保这些变化已经生效后再进行其他操作。
  1. 摄像机跟随:
  • LateUpdate() 常常被用于实现摄像机的跟随功能。因为摄像机跟随要依赖于物体的位置更新,而这些更新通常发生在 Update() 中。将摄像机的跟随逻辑放在 LateUpdate() 中可以避免摄像机在物体移动前更新,导致视觉上的迟滞。
  1. 顺序问题:
  • 在 Unity 中,脚本的执行顺序可能会影响游戏的行为。LateUpdate() 被保证在所有 Update() 函数执行完毕后调用,但在同一帧中,不同脚本的 LateUpdate() 调用顺序是不确定的。这一点需要特别注意,避免因脚本执行顺序而导致错误行为。

示例代码:

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public Transform target;
    public float smoothSpeed = 0.125f;
    public Vector3 offset;

    private void LateUpdate()
    {
        Vector3 desiredPosition = target.position + offset;
        Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed * Time.deltaTime);
        transform.position = smoothedPosition;

        transform.LookAt(target);
    }
}

在这个示例中,我们编写了一个简单的脚本来实现摄像机的跟随功能。在 LateUpdate() 函数中,我们通过插值方法平滑地调整摄像机位置,确保摄像机跟随在目标物体后面。transform.LookAt(target) 确保摄像机一直朝向目标。

总结而言,LateUpdate() 函数是一个重要的Unity生命周期函数,用于在 Update() 之后处理变化和逻辑,特别适合处理相对于 Update() 产生的变化,以及实现摄像机跟随等操作。





TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐沐森的故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值