在其他两个游戏对象之间“挤压”GameObject?

时间:2015-11-29 07:33:36

标签: c# unity3d collision-detection unity5

我试图“挤压”一个GameObject,当Squeezer1和Squeezer2 与它相撞并继续向对方移动时。我希望减小宽度(x比例),以便GameObject的总面积保持,同时仍然在两个Squeezers之间。因为我不是高级程序员,有人可以为我提供可随时部署的脚本吗?enter image description here

这个问题与这个问题密切相关:Question

2 个答案:

答案 0 :(得分:2)

  1. 您需要构建对象层次结构
  2. 您的根对象只有转换(kupMaster)
  3. 根对象
  4. 下有3种不同的游戏对象
  5. 第一个具有立方体的所有属性,除了被称为的碰撞器 cubeProps。
  6. 第二个有一个变换和一个盒子对撞机和这个对撞机     一个伸展整个立方体的常规对象。这个对象也有一个脚本,我们将使用这个脚本来处理事件。
  7. 第三个也有一个trasnform和一个盒子对撞机。当立方体吱吱作响时,立方体将具有它的比例,因此您需要定义它的尺度,以便您的立方体在发出吱吱声时具有什么样的效果。
  8. 这是设计 enter image description here

    脚本如何工作?

    • 它有box,squezedbox,defaultScale,speed和counter。

    • squezed box - > squzedBox对象,在设计时用蓝灰色标记。

    • 框 - > 在设计时使用绿色标记的cubeProps对象。

    • defaultScale - > 将是您的默认比例。您可以在Start()方法中指定它。它将有盒子的比例。

    • 速度 - > 这是让你的立方体吱吱作响或释放看起来像弹簧的价值。

    重要的是我们要改变盒子对象(cubeProps)的比例,因为它有网格渲染器组件。

    using UnityEngine;
    using System.Collections;
    
    public class normalBoxScript : MonoBehaviour {
    
        private int counter;
        public GameObject box;
        public GameObject squezeBox;
        private Vector3 defaultScale;
        public float speed;
        // Use this for initialization
        void Start () {
            defaultScale = box.transform.localScale;
        }
        void Update () {
            Debug.Log(counter);
             updateScale();
        }
        void OnTriggerEnter(Collider col)
        {
           if (col.tag == "Player")
            {
                counter++;
            }
        }
        void OnTriggerExit(Collider col)
        {
            if (col.tag == "Player")
            {
                counter--;
            }
        }
    
        void updateScale()
        {
            if (counter == 2)
            {
               box.transform.localScale = Vector3.MoveTowards(box.transform.localScale, squezeBox.transform.localScale, speed); 
            }
            else 
            {
                box.transform.localScale = Vector3.MoveTowards(box.transform.localScale, defaultScale, speed); 
            }
      }
     }
    

    结果 enter image description here

答案 1 :(得分:0)

如果您只使用具有三个组件(长度X,长度Y,长度Z)的立方体,并且挤压始终垂直于表面(意味着角度不会改变),您可以基本上将问题减少为找到两个一个人被固定的组件。在您的例子中,宽度设置为两个挤压立方体的面之间的距离,并且当您需要保存区域时,您可以推断出高度。

Area = Width * Height
Height = Area / NewWidth
Width = NewWidth

在三维中,您可以假设您要推导的两个组件是相等的......

正如我写这篇文章一样,我认为你可以通过弹簧正确地模拟这个。方形/立方体的每个边缘都是连接角落的弹簧。应定义弹簧的粗糙度,l0应为您考虑的长度。

有点提醒春天方程:

Let F be the force exerced by a spring
l0 the length of the spring at rest
l the current length of the spring
k a constant that tweak the force (equivalent to the roughness of the spring)

F = k * (l - l0)

如果挤压垂直于表面,单独的弹簧将无法保护该区域。在这种情况下,您需要更新未取消维度的 l0