C# &引用;挤压;两个其他游戏对象之间的游戏对象?

C# &引用;挤压;两个其他游戏对象之间的游戏对象?,c#,unity3d,collision-detection,unity5,C#,Unity3d,Collision Detection,Unity5,我正试图“挤压”一个游戏对象,挤压器1和挤压器2都与之碰撞,并继续朝着对方移动。我希望缩小宽度(x比例),这样游戏对象的总面积保持在两个挤压器之间。因为我不是高级程序员,有人能为我提供一个随时可以部署的脚本吗 这个问题与这个问题密切相关:如果你只处理有三个分量(lengthX、lengthZ、lengthZ)的立方体,并且挤压总是垂直于曲面(意味着角度不会改变),那么当一个分量固定时,你基本上可以将问题简化为找到两个分量。在您的示例中,“宽度”设置为两个压缩立方体的面之间的距离,并且由于需要保留

我正试图“挤压”一个游戏对象,挤压器1和挤压器2都与之碰撞,并继续朝着对方移动。我希望缩小宽度(x比例),这样游戏对象的总面积保持在两个挤压器之间。因为我不是高级程序员,有人能为我提供一个随时可以部署的脚本吗


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

如果你只处理有三个分量(lengthX、lengthZ、lengthZ)的立方体,并且挤压总是垂直于曲面(意味着角度不会改变),那么当一个分量固定时,你基本上可以将问题简化为找到两个分量。在您的示例中,“宽度”设置为两个压缩立方体的面之间的距离,并且由于需要保留面积,您可以推断高度

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

  • 您需要构建一个对象层次结构
  • 根对象只有一个变换(kupMaster)
  • 根对象下有3个不同的游戏对象
  • 第一个具有立方体的所有属性,但称为碰撞器的碰撞器除外 立方螺帽
  • 第二个有一个变换和一个盒子碰撞器,这个碰撞器 一个常规的拉伸整个立方体。这个对象也有一个脚本,我们将用这个脚本处理压缩的事情
  • 第三个有一个trasnform和一个盒子对撞机。当立方体被压缩时,立方体将有它的比例,所以你们需要定义它的比例,你们希望你们的立方体在压缩时有什么样的比例
  • 这就是设计

    脚本是如何工作的

    • 它有长方体、压缩长方体、默认比例、速度和计数器

    • 压缩框-->squzedBox对象,在设计上用蓝灰色签名

    • box-->cubeProps对象,在设计上用绿色签名

    • 默认比例-->将是您的默认比例。您可以在Start()方法中分配它。它有盒子的刻度

    • 速度-->这是使立方体挤压或释放看起来像弹簧的值
    我们要更改长方体对象(立方体贴图)的比例非常重要,因为它有网格渲染器组件。

    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); 
            }
      }
     }
    
    结果呢

    l
    替换为
    y
    并将
    l0
    替换为
    ou
    :)因为我不是高级程序员,我需要一个问题中提到的随时可以部署的脚本。Stackoverflow并不意味着让其他人为您编写所有代码。我们的想法是,您可以使用此建议,自己编写代码。为准备部署的脚本启动Open bounty worth+200 reputation!因为我不是一个高级程序员,所以我需要一个问题中提到的准备部署脚本!感谢您的编辑,但为了获得+200声誉,您必须提供一个随时可以部署的脚本。抱歉,我没有注意到这一点。你能把它转换成文本,这样我们就可以复制粘贴它了吗?@Dimitri我怎么能在这里共享文本?你只需要写一个看起来像这样的脚本。老兄,你需要提供更多的细节,比如-挤压器对象有刚体和碰撞器吗?他们是被剧本感动还是被物理感动?它们能一路移动并相互接触吗?如果您不提供有关需要脚本在其中工作的环境的任何详细信息,则无法拥有随时可以部署的脚本。请不要对我无礼,祝你好运!挤压器对象通过脚本移动,具有刚体和碰撞器,可以一直移动。请你写一个答案好吗@这是一个老问题。。这是完整的解决方案