【问题标题】:Spinning cube when triggered - C# Unity触发时旋转立方体 - C# Unity
【发布时间】:2018-02-16 16:43:23
【问题描述】:

我对编码完全陌生,所以任何帮助都会很有价值。

当对撞机进入立方体的盒子对撞机时,我试图让一个立方体(这是一个带有材料的进口 FBX)旋转。我一直在关注 2 个教程来帮助我前进。第一个是旋转立方体,我成功完成了,第二个是在进入“触发区”时为游戏添加声音/音乐,再次,这没问题。

我现在希望立方体在进入触发区域时旋转,所以我想我可以结合 2 并使其工作,但过了好一会儿我走到了死胡同。由于我缺乏理解,我不知道为什么当脚本添加到多维数据集时我所写的内容不起作用。

我遵循的立方体教程 - https://unity3d.com/learn/tutorials/topics/scripting/spinning-cube

我跟随的音乐教程 - https://unity3d.com/learn/tutorials/topics/audio/adding-music-your-game

以及我基于上述组合的旋转立方体的失败尝试 -

using UnityEngine;
using System.Collections;

public class TriggerSpinControl : MonoBehaviour
{
    public float speed1 = 25f;
    public float speed2 = 100f;


    void OnTriggerEnter(Collider other)
        {
            if (other.CompareTag("TriggerZone"))

            {

             transform.Rotate(Vector3.forward, speed1 * Time.deltaTime);
            }
        }

        void OnTriggerExit(Collider other)
        {
            if (other.CompareTag("TriggerZone"))
            {

            transform.Rotate(Vector3.forward, speed2 * Time.deltaTime);
            }

        }


}

任何帮助将不胜感激。

谢谢


根据下面 Rutter 的回答,我尝试创建一个脚本(基于来自其他问题和答案的各种信息),该脚本要求在 TriggerEnter 和 TriggerExit 上运行 2 个 Spin 脚本,但是因为我我仍在尝试弄清楚并理解我在做什么,它似乎不起作用。

旋转脚本不附加到游戏对象,而只是在 Assets 文件夹中。

using UnityEngine;
using System.Collections;

public class TriggerSpinControl : MonoBehaviour

{ 
    private SpinFast spinfast;
    private SpinSlow spinslow;


        void OnTriggerEnter(Collider other)
        {
        if (other.CompareTag("TriggerZone"))

            {           

               spinfast = GetComponent<SpinFast>();   
            }

        }

        void OnTriggerExit(Collider other)
        {
            if (other.CompareTag("TriggerZone"))
            {

              spinslow = GetComponent<SpinSlow>();

            }

        }


}

这可能只是一堆废话,但我希望我走在正确的轨道上。

谢谢

【问题讨论】:

  • 使用 OnTriggerStay() :)

标签: c# unity3d


【解决方案1】:

OnTriggerEnter 将在对象进入触发器时调用一次。

OnTriggerExit 将在对象退出触发器时调用一次。

如果您希望对象继续旋转,您可能需要尝试不同的策略。

OnTriggerStay 是另一个事件,对于当前在触发器中的每个对象,它每帧大约会调用一次。这将允许您每帧调用一次transform.Rotate,以在每帧上保持一点旋转。这是一个简单但脆弱的解决方案。

Unity 是一种“基于组件”的架构——您的每个脚本都是一个组件,将多个协同工作的组件组合在一起通常是有利的。您可以创建一个脚本来管理每帧调用一次的Update 事件中的旋转行为,然后创建另一个组件来根据触发器进入/退出启用和禁用旋转脚本。

【讨论】:

    【解决方案2】:

    这是我的解决方案。

    代码(C#):

    using UnityEngine;
    using System.Collections;
    
    public class TriggerSpinControl : MonoBehaviour
    {
        public float speed1 = 25f;
        public float speed2 = 100f;
    
        private void Update()
        {
            transform.Rotate(Vector3.forward, speed2 * Time.deltaTime);
        }
    
        private void OnTriggerEnter(Collider other)
        {
            if (other.tag == "MainCamera")
            {
                enabled = false;
            }
        }
    
        void OnTriggerStay(Collider other)
        {
            if (other.tag == "MainCamera")
    
            {
    
                transform.Rotate(Vector3.forward, speed1 * Time.deltaTime);
            }
        }
    
        private void OnTriggerExit(Collider other)
        {
            if (other.tag == "MainCamera")
            {
    
                enabled = true;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2021-10-31
      • 2021-06-23
      • 2021-08-04
      • 1970-01-01
      相关资源
      最近更新 更多