Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将游戏对象捕捉到网格?_C#_Unity3d_2d_Mouse - Fatal编程技术网

C# 将游戏对象捕捉到网格?

C# 将游戏对象捕捉到网格?,c#,unity3d,2d,mouse,C#,Unity3d,2d,Mouse,我正在制作一个2D TD游戏,目前我已经使用quill18教程制作了一个简单的建筑系统。然而,当我把鼠标移到瓷砖上时,我试着让它卡在瓷砖上 这是应用于建筑对象的脚本 void Update(){ Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); mousePos.z = 0; Vector2 mp = mousePos; this.transform.positi

我正在制作一个2D TD游戏,目前我已经使用quill18教程制作了一个简单的建筑系统。然而,当我把鼠标移到瓷砖上时,我试着让它卡在瓷砖上

这是应用于建筑对象的脚本

    void Update(){
    Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    mousePos.z = 0;
    Vector2 mp = mousePos;
    this.transform.position = mousePos;

    Collider2D col = GetComponent<Collider2D> ();

    if (GameManager.instance.player.CanAffordCurrentBuilding()
        && !col.IsTouchingLayers(LayerMask.GetMask("NonBuildingLayer"))
        && col.IsTouchingLayers(LayerMask.GetMask("BuildingLayer"))
        && !col.IsTouchingLayers(LayerMask.GetMask("BlockingLayer"))) {
        SpriteRenderer[] sprites = GetComponentsInChildren<SpriteRenderer>();
        foreach(SpriteRenderer sr in sprites)
            sr .color = Color.green;
        canPlace = true;
    } 
    else {
        SpriteRenderer[] sprites = GetComponentsInChildren<SpriteRenderer>();
        foreach(SpriteRenderer sr in sprites)
            sr .color = Color.red;
        canPlace = false;
    }

    if (Input.GetMouseButtonDown (0) && canPlace) {
        SpriteRenderer[] sprites = GetComponentsInChildren<SpriteRenderer>();
        foreach(SpriteRenderer sr in sprites)
            sr .color = Color.white;
        Destroy(GetComponent<Rigidbody2D>() );
        Destroy(this);
        GameManager.instance.player.BuildingWasPlaced();

    }
void Update(){
Vector3 mousePos=Camera.main.ScreenToWorldPoint(Input.mousePosition);
mousePos.z=0;
Vector2 mp=鼠标点;
this.transform.position=鼠标点;
col=GetComponent();
if(GameManager.instance.player.CanAffordCurrentBuilding()
&&!col.isTouchLayers(LayerMask.GetMask(“非构建层”))
&&col.isTouchLayers(LayerMask.GetMask(“BuildingLayer”))
&&!col.isTouchLayers(LayerMask.GetMask(“BlockingLayer”)){
SpriteRenderer[]sprites=GetComponentsInChildren();
foreach(精灵中的高级喷洒器)
sr.color=color.green;
canPlace=true;
} 
否则{
SpriteRenderer[]sprites=GetComponentsInChildren();
foreach(精灵中的高级喷洒器)
sr.color=color.red;
canPlace=false;
}
if(Input.GetMouseButtonDown(0)和&canPlace){
SpriteRenderer[]sprites=GetComponentsInChildren();
foreach(精灵中的高级喷洒器)
sr.color=color.white;
销毁(GetComponent());
摧毁(这个);
GameManager.instance.player.buildingwasplace();
}
如果触摸层是“BuildingLayer”我将能够放置该对象,并且该对象始终跟随我的鼠标,直到我放置它为止。但是,我希望它仅在触摸层不是BuildingLayer时跟随我的鼠标。当触摸层是BuildingLayer时,我希望它捕捉到最靠近鼠标的瓷砖上。并不断更改捕捉在鼠标周围移动时平铺

我怎样才能完成这样的事情?
我有一个名为grid的列表,其中包含游戏中所有的建筑瓷砖,如果有帮助的话。

我想你可以做的是在你的建筑中添加触发碰撞框。 如果要拖动一个,请使要拖动的那个有一个稍微大一点的触发器碰撞框。
然后检查拖动的对象上是否存在触发碰撞,如果是,则捕捉到与碰撞对象相关的位置。您需要检查碰撞是在底部、左侧、顶部还是右侧。

我想您可以做的是在建筑物中添加触发碰撞框。 如果要拖动一个,请使要拖动的那个有一个稍微大一点的触发器碰撞框。 然后检查拖动的对象上是否存在触发碰撞,如果存在,则捕捉到与碰撞对象相关的位置。您需要检查碰撞是在底部、左侧、顶部还是右侧