Unity3D实践系列07,组件的启用或禁用开关,物体的的可见或不可见开关,以及相应事件...

本文详细介绍了如何在Unity3D中创建项目,包括场景、物体的创建与调整,以及使用脚本来控制物体的可见性和激活状态。通过实例演示了如何响应用户输入,如键盘按键,来动态改变物体的属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

创建一个Unity项目。

 

在"Project"窗口中,在"Asserts"中,添加"_MyScene"文件夹。

 

点击"File"中的"Save Scene",给Scene命名,并保存到"_MyScene"文件夹。

 

创建一个类型为"Plane"的GameObject,并调整其大小。

 

创建一个类型为"Cube"的GameObject,并适当调整大小。

 

使用脚本控制物体组件的Enable/Disable

 

选中"Hierarchy"窗口下的"Cube",如果把其对应的"Inspector"窗口中"Meshe Render"的勾选去掉,将会在"Scene"窗口中看到一个空心的Cube。也就是说,组件可以通过显式的方式被声明为Enable或Disable。

 

还可以通过脚本的方式控制组件的可见性。

 

在"Project"窗口中,在"Asserts"中,添加"_Scripts"文件夹。

 

在"_Scripts"文件夹下创建一个名称为"EnableComponent"的脚本,双击,在Visual Studio中打开并编辑。

 


 
using UnityEngine;
using System.Collections;

 
public class EnableComponent : MonoBehaviour
{

 
    public MeshRenderer mMesh;

 
    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}

 
 
 

 

把"EnableComponent"脚本拖动到"Hierarchy"窗口中的"Cube"上,此时在其对应的"Inpector"窗口中的脚本组件中,多了一个"M Mesh"属性。

24

 

把"Hierarchy"窗口的"Cube"拖动到"M Mesh"属性值框中,Unity会自动识别Cube上的MeshRenderer,使其成为"M Mesh"的属性值。

 

现在,我们想当按下键盘上的空格键,让Cube成为空心,即设置Cube脚本组件的"M Mesh"属性值。修改"EnableComponent"脚本如下:

 


 
using UnityEngine;
using System.Collections;

 
public class EnableComponent : MonoBehaviour
{

 
    public MeshRenderer mMesh;

 
    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            mMesh.enabled = false;
        }
    }
}

 

 

 
 
 

 

保存,并运行游戏。

 

当按下键盘中的空格键,在"Game"窗口中的Cube自动消失。

 

如果想通过键盘上的空格键来切换Cube的可见/不可见状态,修改"EnableComponent"脚本如下:


保存,并运行游戏。

 

当每次按下键盘中的空格键,在"Game"窗口中的Cube要么可见,要么不可见。

 

使用脚本控制物体的Active/Inactive

 

再创建一个类型为"Sphere"的球体,适当调整位置和大小。

 

在"_Scripts"文件夹下创建一个名称为"SetActive"的脚本,双击,在Visual Studio中打开并编辑。

 


 
using UnityEngine;
using System.Collections;

 
public class SetActive : MonoBehaviour {

 
    // Use this for initialization
    void Start () {

 
        //gameObject表示当前物体
        gameObject.SetActive(false);
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}

 
 
 

 

把"SetActive"脚本拖动到"Hierarchy"窗口的"Sphere"上。

 

保存,运行游戏,球体不会出现。

 

当然,物体的可见性最直接的做法是在"Inspector"窗口中显式设置。

 

OnEnable, OnDisable与OnDestry

 

这是3个响应事件函数。

OnEnable:当对象变为可用或激活状态时被调调用。
OnDisable:当对象变为不可用或非激活状态时被调用。
OnDestroy:当MonoBehaviour将被销毁时调用。注意,是脚本被销毁时调用,而不是物体被销毁时被调用。

 

创建一个名称为"DisableDestroy"的脚本,编写如下:

 


 
using UnityEngine;
using System.Collections;

 
public class DisableDestroy : MonoBehaviour {

 
    void OnEnable()
    {
        Debug.Log("script was enabled");
    }

 
    void OnDisable()
    {
        Debug.Log("script was disable");
    }

 
    void OnDestroy()
    {
        Debug.Log("script was destroyed");
    }
    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}

 
 
 

 

选中"Hierarchy"窗口中"Cube",把原先的脚本组件删除,再把"DisableDestroy"的脚本拖动其上。

 

保存,运行游戏,在运行过程中,把"Disable Destroy(Script)"的勾选去掉,停止运行,控制台显示如下:

25


参考资料:极客学院Unity3D课程

<think>首先,用户的问题是关于Unity中使用Position Constraint组件时,如何防止子物体跟随父物体移动。用户说:"我想在Unity中使用Position Constraint组件时,如何防止子物体跟随父物体移动",意思是他们想使用Position Constraint组件,但想让子物体跟随父物体移动。 从引用中,我有一些相关信息: - 引用[1]和[2]提到Constraint组件,如Position Constraints,用于关联物体的位置、旋转等,而用设置父子关系。 - 引用[4]提到了Rigidbody和约束,但主要是关于刚体的约束。 用户的具体问题是关于Position Constraint组件的。Position Constraint组件允许一个物体跟随另一个物体的位置,但用户想阻止这种跟随。 在Unity中,Position Constraint组件用于将一个物体的位置约束到另一个多个物体的位置。默认情况下,它会根据权重设置来跟随目标物体的位置。 要防止子物体跟随父物体移动,我需要考虑如何配置Position Constraint组件来实现这一点。 可能的解决方案: 1. **权重设置**:在Position Constraint组件中,每个目标物体都有一个权重。如果权重设置为0,那么该目标物体会影响约束物体的位置。所以,如果用户想临时永久停止跟随,可以将权重设置为0。 2. **禁用组件**:直接禁用Position Constraint组件,这样约束就会失效,物体再跟随。 3. **动态控制**:通过脚本动态调整权重启用/禁用组件。 用户说"防止子物体跟随父物体移动",在Position Constraint的语境中,"子物体"可能指的是被约束的物体,"父物体"可能指的是目标物体。在Constraint组件中,是父子关系,而是约束关系。 所以,被约束的物体是"子",目标物体是"父"。 要防止跟随: - 设置权重为0:在Position Constraint组件中,为每个目标设置权重为0。 - 禁用组件:直接禁用Position Constraint组件。 - 如果使用多个目标,调整权重。 在回答中,我需要提供清晰的步骤。 系统级指令: - 所有行内数学表达式用$...$,但这个问题涉及数学,所以可能需要。 - 独立公式用$$...$$,但这里没有公式。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 引用标识:[^1], [^2], 等。我有引用[1]到[4],但它们是参考,是直接相关。用户提供了这些引用,但我需要基于它们回答。 用户说:"上述引用仅供参考,并是用户真正的需求",所以我应该基于问题回答。 用户的问题:如何在Unity Position Constraint组件中阻止子物体跟随父物体移动。 从引用[2]:"Position Constraints: 关联位置关系",所以Position Constraint用于位置关联。 回答结构: 1. 解释Position Constraint组件。 2. 提供防止跟随的方法。 3. 步骤清晰。 4. 生成相关问题。 最后添加引用标识,但引用是用户提供的,我需要引用它们吗?指令说:"回答中引用的段落末尾自然地添加引用标识",所以如果我引用用户提供的文本,就添加标识。 但在这个问题中,我可能需要直接引用,除非我使用它们。 许我可以引用相关部分。 例如,从引用[2]:"Position Constraints: 关联位置关系"。 方法: - **方法1: 设置权重为0** - 在Inspector窗口中,找到Position Constraint组件。 - 对于每个目标物体,将权重(Weight)设置为0。 - 这样,约束物体再跟随目标物体的位置。 - **方法2: 禁用组件** - 在Inspector窗口中,取消勾选Position Constraint组件启用复选框。 - 这将完全禁用约束,物体再跟随。 - **方法3: 通过脚本控制** - 使用脚本动态设置权重启用状态。 - 例如:`positionConstraint.enabled = false;` `positionConstraint.weight = 0f;` 在Unity中,Position Constraint组件有多个目标,每个目标有权重。权重总和影响位置。 如果只有一个目标,设置权重为0即可。 如果多个目标,设置特定目标的权重为0。 但用户说"父物体",可能只有一个目标。 生成相关问题: 1. 如何在Unity中动态控制Position Constraint组件? 2. Position Constraint组件有哪些常见应用场景? 3. 如何组合多个Constraint组件实现复杂效果? 确保回答真实可靠。我熟悉Unity,所以应该正确。 回答用中文。 结构: - 先简要介绍Position Constraint。 - 然后给出方法。 - 最后相关问题。</think>### 如何在Unity中防止子物体跟随父物体移动 在Unity中使用Position Constraint组件时,子物体(被约束物体)默认会跟随父物体(目标物体)的位置移动。要防止这种跟随,可以通过调整Position Constraint组件的权重禁用组件来实现。Position Constraint组件允许将一个物体的位置约束到另一个多个目标物体的位置,而需要设置父子关系[^2]。以下是具体方法,步骤清晰且易于操作。 #### 方法1: 设置权重为0(推荐) 权重(Weight)控制目标物体对约束物体位置的影响程度。当权重为0时,子物体再跟随目标物体移动。 1. **选择子物体**:在Unity编辑器中选择被约束的子物体(即添加了Position Constraint组件物体)。 2. **调整权重**: - 在Inspector窗口中找到Position Constraint组件。 - 对于每个目标物体(父物体),将其权重(Weight)值设置为0。 - 例如,如果只有一个父物体,直接将权重滑块拖到0;如果有多个目标,确保相关父物体的权重为0。 3. **效果**:子物体立即停止跟随父物体移动,但组件仍处于启用状态,方便后续重新启用。 #### 方法2: 禁用Position Constraint组件 直接禁用组件可以完全停止约束效果。 1. **选择子物体**:在Unity编辑器中选择被约束的子物体。 2. **禁用组件**: - 在Inspector窗口中找到Position Constraint组件。 - 取消勾选组件左上角的启用复选框(通过代码设置)。 3. **效果**:子物体再受任何位置约束影响,位置保持固定。 #### 方法3: 通过脚本动态控制(适用于运行时) 使用脚本可以灵活控制约束行为,例如在游戏运行时临时停止跟随。 1. **添加脚本**:在子物体上添加一个C#脚本(如`StopFollowController.cs`)。 2. **编写代码**:在脚本中引用Position Constraint组件,并设置权重启用状态。 ```csharp using UnityEngine; using UnityEngine.Animations; // 需要引用此命名空间 public class StopFollowController : MonoBehaviour { private PositionConstraint positionConstraint; void Start() { // 获取Position Constraint组件 positionConstraint = GetComponent<PositionConstraint>(); if (positionConstraint == null) { Debug.LogError("PositionConstraint组件未找到!"); } } // 方法:停止跟随父物体(设置权重为0) public void StopFollowing() { if (positionConstraint != null) { // 设置所有目标的权重为0(指定特定目标) for (int i = 0; i < positionConstraint.sourceCount; i++) { positionConstraint.SetWeight(i, 0f); // 权重设置为0 } // 者直接禁用组件:positionConstraint.enabled = false; } } // 方法:恢复跟随(例如设置权重回原值) public void ResumeFollowing(float weight) { if (positionConstraint != null) { for (int i = 0; i < positionConstraint.sourceCount; i++) { positionConstraint.SetWeight(i, weight); // 恢复权重 } // 启用组件:positionConstraint.enabled = true; } } } ``` - **说明**:此脚本提供了`StopFollowing()`和`ResumeFollowing()`方法,可在游戏事件(如按钮点击)中调用。权重值通常在0-1之间,0表示无影响。 3. **使用场景**:适用于需要动态开关约束的情况,例如在游戏中暂停物体移动。 #### 注意事项 - **权重设置**:如果Position Constraint有多个目标物体,设置权重为0只会停止特定目标的影响,其他目标仍可能约束位置。确保检查所有目标权重[^2]。 - **性能影响**:禁用组件设置权重为0会增加性能开销,但动态脚本控制需注意优化。 - **替代方案**:如果完全需要约束,考虑移除Position Constraint组件,但此操作可逆,需谨慎。 - **与父子关系对比**:Position Constraint的优势在于创建父子层级,允许一个物体同时约束到多个目标,这在UI跟随3D物体等场景中非常有用[^3]。 通过以上方法,您可以轻松防止子物体跟随父物体移动,同时保留约束组件的灵活性。Unity的Constraint组件系列(如Position Constraint)是模拟位置关联的高效工具,避免了传统父子关系的限制[^1][^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值