📜  Unity 制作归位对象 - C# (1)

📅  最后修改于: 2023-12-03 15:05:45.051000             🧑  作者: Mango

Unity 制作归位对象 - C#

本文将介绍如何使用Unity和C#制作一个可拖动的对象,当放置在特定的区域内时,它会自动归位到该区域的原点。

实现思路

我们将使用Unity的Drag and Drop功能,将该对象限制在特定的区域内,并在放置时将其自动归位到该区域的原点。

具体来说,我们将使用以下步骤来实现该功能:

  1. 设置一个区域,定义其大小和位置。
  2. 创建一个可拖动的对象,并将其限制在该区域内。
  3. 编写代码以检测对象是否在该区域内,并在放置时将其自动归位。
步骤
设置区域

首先,我们需要设置一个区域,我们将使用Unity的Collider组件来实现该功能。

  1. 在Unity编辑器中,选择需要设置该区域的游戏对象。
  2. 在Inspector面板中,点击“Add Component”按钮,并选择Collider组件。

Add Collider Component

  1. 选择需要的Collider类型。在本例中,我们将使用Box Collider。

Select Box Collider

  1. 调整Collider的大小和位置,使其与相应的区域对齐。在本例中,我们将创建一个正方形区域。

Adjust Collider

创建可拖动的对象

现在,我们将创建一个可拖动的对象,并将其限制在该区域内。

  1. 在Unity编辑器中,创建一个游戏对象。我们将其命名为“DraggableObject”。
  2. 将该对象的位置设置为在区域外。在本例中,我们将将其放置在区域左上角之外。

Position Draggable Object

  1. 给该对象添加刚体(Rigidbody)组件。

Add Rigidbody Component

  1. 编写代码以实现拖放功能。在本例中,我们将使用以下代码:
using UnityEngine;

public class DraggableObject : MonoBehaviour
{
    private bool isDragging = false;
    private Vector3 offset;
    private Rigidbody rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void OnMouseDown()
    {
        offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f));

        rb.freezeRotation = true;
        isDragging = true;
    }

    private void OnMouseDrag()
    {
        Vector3 newPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f)) + offset;
        if (GetComponent<BoxCollider>().bounds.Contains(newPosition))
        {
            transform.position = newPosition;
        }
    }

    private void OnMouseUp()
    {
        rb.freezeRotation = false;
        isDragging = false;
    }
}

让我们来分析一下这段代码。首先,我们定义了一个布尔值isDragging,用于跟踪当前对象是否正在被拖动。我们还定义了一个向量offset,该向量将使用当前鼠标位置来计算初始物体位置。

在Start()函数中,我们获取了该对象的刚体组件。

在OnMouseDown() 函数中,我们记录了当前鼠标位置与物体位置之间的偏移量,并将刚体的旋转冻结,以防止物体在被拖动时旋转。

在OnMouseDrag() 函数中,我们将物体的位置设置为当前鼠标位置和偏移量之和。我们还检查了物体是否在区域内,在该区域外的位置将被忽略。

在OnMouseUp() 函数中,我们解冻了刚体组件,因为物体不再被拖动。

检测归位

现在,我们需要编写代码来检测何时将物体归位。在本例中,我们将检查对象是否在区域内,并在对象被放置在该区域内时将其归位到区域中心。

我们将使用以下代码来实现此功能:

using UnityEngine;

public class DraggableObject : MonoBehaviour
{
    private bool isDragging = false;
    private Vector3 offset;
    private Rigidbody rb;
    public Vector3 startingPosition;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
        startingPosition = transform.position;
    }

    private void OnMouseDown()
    {
        offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f));

        rb.freezeRotation = true;
        isDragging = true;
    }

    private void OnMouseDrag()
    {
        Vector3 newPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f)) + offset;
        if (GetComponent<BoxCollider>().bounds.Contains(newPosition))
        {
            transform.position = newPosition;
        }
    }

    private void OnMouseUp()
    {
        rb.freezeRotation = false;
        isDragging = false;

        if (GetComponent<BoxCollider>().bounds.Contains(startingPosition))
        {
            transform.position = startingPosition;
        }
    }
}

在这个版本的代码中,我们添加了一个公共的Vector3变量startingPosition,它将保存物体的默认位置。

在Start()函数中,我们将startingPosition设置为物体的初始位置,并将其赋给startingPosition变量。

在OnMouseUp() 函数中,我们检查物体是否在区域内。如果是这样,则将其位置设置为startingPosition。

总结

在本文中,我们介绍了如何使用Unity和C#制作一个可拖动的对象,并在将其放置在特定区域内时将其归位到该区域的原点。我们将使用Collider组件来定义区域,并编写代码以实现拖放和自动归位功能。