生成" ramp"的算法Unity中的对象

时间:2018-05-29 08:56:03

标签: c# algorithm unity3d

我在Unity中为我的A-level计算机科学项目创建了一个基本的模拟器。此时,用户能够通过选择相关工具并单击并拖动以确定框的两个相对角来绘制框(板条箱)对象,从而确定其尺寸。

该盒子由一个预制件组成,该预制件被实例化并且其尺寸相应地改变。它的代码如下:

void Start () {
    boxAnim = boxButton.GetComponent<Animator>();
}

// Update is called once per frame
void Update()
{   
    //sets the mouseDown and mouseHeld bools and the mouse position Vector3
    mouseDown = Input.GetMouseButtonDown(0);
    mouseHeld = Input.GetMouseButton(0);
    mousePosition = Input.mousePosition;
    //checks if the user has started to draw
    if (mouseDown && !draw)
    {
        draw = true;
        originalMousePosition = mousePosition;

    }
    //checking if the user has released the mouse
    if (draw && !mouseHeld)
    {
        finalMousePosition = mousePosition;
        draw = false;
        if (boxAnim.GetBool("Pressed") == true) //if the box draw button is pressed
        {
            boxDraw(originalMousePosition, finalMousePosition); //draws crate
        }
    }
}

void boxDraw(Vector3 start, Vector3 end)
{
    //asigns world coordinates for the start and end mouse positions
    worldStart = Camera.main.ScreenToWorldPoint(start);
    worldEnd = Camera.main.ScreenToWorldPoint(end);
    if (worldStart.y >= -3.2f && worldEnd.y >= -3.2f)
    { 
        //determines the size of box to be drawn
        boxSize.x = Mathf.Abs(worldStart.x - worldEnd.x);
        boxSize.y = Mathf.Abs(worldStart.y - worldEnd.y);
        //crate sprite is 175px wide, 175/50 = 3.5 (50px per unit) so the scale factor must be the size, divided by 3.5
        boxScaleFactor.x = boxSize.x / 3.5f;
        boxScaleFactor.y = boxSize.y / 3.5f;
        //initial scale of the box is 1 (this isn't necessary but makes reading program easier)
        boxScale.x = 1 * boxScaleFactor.x;
        boxScale.y = 1 * boxScaleFactor.y;
        //creates a new crate under the name newBox and alters its size
        GameObject newBox = Instantiate(box, normalCoords(start, end), box.transform.rotation) as GameObject;
        newBox.transform.localScale = boxScale;
    }
}

Vector3 normalCoords(Vector3 start, Vector3 end)
{
    //takes start and end coordinates as position coordinates and returns a world coordinate coordinate for the box
    if(end.x > start.x)
    {
        start.x = start.x + (Mathf.Abs(start.x - end.x) / 2f);
    }
    else
    {
        start.x = start.x - (Mathf.Abs(start.x - end.x) / 2f);
    }
    if(end.y > start.y)
    {
        start.y = start.y + (Mathf.Abs(start.y - end.y) / 2f);
    }
    else
    {
        start.y = start.y - (Mathf.Abs(start.y - end.y) / 2f);
    }
    start = Camera.main.ScreenToWorldPoint(new Vector3(start.x, start.y, 0f));
    return start;
}

以类似的方式,我希望能够有一个&#39; ramp&#39;可以创建对象,以便用户可以单击并拖动以确定基本宽度,然后再次单击以确定高程/高度角度(斜坡将始终为直角三角形。)问题在于我希望将斜坡作为我创建的精灵,而不仅仅是基本的块颜色。然而,单个精灵只有一个仰角,并且没有变换能够改变它(据我所知)。显然我不想创建一个不同的精灵。每个角度,我能做什么?

我想到的解决方案是,如果有某种功能,我可以在代码中改变矢量图像的节点,但我很确定这不存在。< / em>

编辑:只是为了澄清这是一个2D环境,代码包含Vector3s只是因为那是我习惯的

2 个答案:

答案 0 :(得分:1)

你提到Sprite是一个2D对象(好吧,它实际上非常类似于Quad,算作3D),但你在问题的其他部分和你的代码中引用了完整的3D,我认为这让人很困惑,因为为精灵创建纹理是一个非常不同的问题。我假设你错误地提到了Sprite并且你实际上想要一个3D对象(Unity大部分时间内都是3D),如果你想要它只能有一面

你可以从代码创建3D形状没有问题,虽然你需要熟悉Mesh类,掌握创建三角形需要一些练习

这里有几个不错的起点

https://docs.unity3d.com/Manual/Example-CreatingaBillboardPlane.html https://docs.unity3d.com/ScriptReference/Mesh.html

答案 1 :(得分:1)

我使用网格物体和多边形对撞机解决了部分问题。我现在有一个函数可以创建一个具有给定宽度和高度的直角三角形和一个三角形形状的对撞机:

<header>
    <p>Some text</p>
</header>

...

/*Separate style.css file*/
header p {
    text-align: center;
}

我只需要将此函数放入与我的代码非常相似的代码中,以便用户可以指定宽度和高度。