更改 Gizmos.DrawWireCube 多维数据集限制,基于子项 transform.position

Change Gizmos.DrawWireCube Cube Limits, based in childs transform.position

提问人:DiogoSaraiva 提问时间:6/12/2015 更新时间:6/13/2015 访问量:770

问:

如何更改基于子变换 (Gizmos.DrawWireSphere) 的 Gizmos.DrawWireCube 的宽度 transform.position 或变换的左/右限制?

到目前为止,我的代码:

位置.cs

using UnityEngine;
using System.Collections;

public class Position : MonoBehaviour {
    void OnDrawGizmos () {
        Gizmos.DrawWireSphere(transform.position, 0.75f);
    }


}

编队控制器:.cs

using UnityEngine;
using System.Collections;

public class FormationController : MonoBehaviour {
    public GameObject enemyPrefab;
    public float width = 10;
    public float height = 5;
    public float speed = 5;
    public float padding = 1.5f;
    public float SpawnDelaySeconds = 1;
    private int direction = 1;
    private float boundaryLeftEdge,boundaryRightEdge;
    private PlayerController playerController;
    // Use this for initialization

    void Start () {
        float distance = transform.position.z - Camera.main.transform.position.z;
        Vector3 leftmost = Camera.main.ViewportToWorldPoint(new Vector3(0, 0, distance));
        Vector3 rightmost = Camera.main.ViewportToWorldPoint(new Vector3(1, 0, distance));
        boundaryLeftEdge = leftmost.x + padding;
        boundaryRightEdge = rightmost.x - padding;
        SpawnUntilFull();
    }



    void OnDrawGizmos () {
        Gizmos.DrawWireCube(transform.position, new Vector3 (width, height));
    }

    // Update is called once per frame
    void Update () {
        float formationRightEdge = transform.position.x + 0.5f * width;
        float formationLeftEdge = transform.position.x - 0.5f * width;
        if (formationRightEdge > boundaryRightEdge) {
            direction = -1;
        }
        if (formationLeftEdge < boundaryLeftEdge) {
            direction = 1;
        }
        transform.position += new Vector3(direction * speed * Time.deltaTime, 0, 0);
        if (AllEnemiesAreDead()) {
            SpawnUntilFull();
        }
    }

    void SpawnUntilFull () {
        Transform freePos = NextFreePosition();
        GameObject enemy = Instantiate(enemyPrefab, freePos.position, Quaternion.identity) as GameObject;
        enemy.transform.parent = freePos;
        if (FreePositionExists()) {
            Invoke ("SpawnUntilFull", SpawnDelaySeconds);
        }

    }

    bool FreePositionExists () {
        foreach( Transform position in transform) {
            if (position.childCount <= 0) {
                return true;
            }
        }
        return false;
    }

    Transform NextFreePosition() {
        foreach (Transform position in transform) {
            if (position.childCount <= 0) {
                return position;
            }
        }
        return null;
    }

    bool AllEnemiesAreDead () {
        foreach(Transform position in transform) {
            if (position.childCount > 0) {
            return false;
            }           
        }
        return true;
    }
}

举个例子:

我正在制作一款类似“太空入侵者”的游戏,但我无法弄清楚当最左边的入侵者死亡时,入侵者的阵型如何变成更小的阵型......因此,新的最左翼入侵者“触及”了左翼边界。

我的场景:

my scene

忽略最顶部的小玩意儿(圆圈)

C# Unity-游戏引擎

评论

1赞 Jinjinov 6/13/2015
当左边的入侵者死去时:你是想让盒子变小,以便它从下一个左边的入侵者开始,还是想把下一个左边的入侵者移得更左?
0赞 DiogoSaraiva 6/13/2015
@JinJi也许......第一个。我想要的是它们左右移动,并且始终触摸相机的边缘(忽略填充)......当最左边的入侵者死去时:新的最左边的入侵者最左边,或者更准确地说是整个阵型
0赞 DiogoSaraiva 6/13/2015
当玩家杀死最多的左/右入侵者(敌人)时,矩形小玩意儿的宽度会变小
0赞 Jinjinov 6/13/2015
你的第一条评论说敌人必须移动,盒子不能改变。你的第二条评论说盒子必须改变。
0赞 DiogoSaraiva 6/13/2015
@JinJi对不起,我的英语拼写不是很好......盒子必须改变,以便形成接触左右边缘

答:

1赞 Jinjinov 6/13/2015 #1

试试这个:

using UnityEngine;
using System.Collections;

public class FormationController : MonoBehaviour {
    public GameObject enemyPrefab;
    public float widthToLeft = 5;
    public float widthToRight = 5;
    public float height = 5;
    public float speed = 5;
    public float padding = 1.5f;
    public float SpawnDelaySeconds = 1;
    private int direction = 1;
    private float boundaryLeftEdge,boundaryRightEdge;
    private PlayerController playerController;
    // Use this for initialization

    void Start () {
        float distance = transform.position.z - Camera.main.transform.position.z;
        Vector3 leftmost = Camera.main.ViewportToWorldPoint(new Vector3(0, 0, distance));
        Vector3 rightmost = Camera.main.ViewportToWorldPoint(new Vector3(1, 0, distance));
        boundaryLeftEdge = leftmost.x + padding;
        boundaryRightEdge = rightmost.x - padding;
        SpawnUntilFull();
    }



    void OnDrawGizmos () {
        Gizmos.DrawWireCube(transform.position, new Vector3 (widthToLeft+widthToRight, height));
    }

    // Update is called once per frame
    void Update () {
        float formationRightEdge = transform.position.x + 0.5f * widthToRight;
        float formationLeftEdge = transform.position.x - 0.5f * widthToLeft;
        if (formationRightEdge > boundaryRightEdge) {
            direction = -1;
        }
        if (formationLeftEdge < boundaryLeftEdge) {
            direction = 1;
        }
        transform.position += new Vector3(direction * speed * Time.deltaTime, 0, 0);
        if (AllEnemiesAreDead()) {
            SpawnUntilFull();
        }
    }

    void SpawnUntilFull () {
        Transform freePos = NextFreePosition();
        GameObject enemy = Instantiate(enemyPrefab, freePos.position, Quaternion.identity) as GameObject;
        enemy.transform.parent = freePos;
        if (FreePositionExists()) {
            Invoke ("SpawnUntilFull", SpawnDelaySeconds);
        }

    }

    bool FreePositionExists () {
        foreach( Transform position in transform) {
            if (position.childCount <= 0) {
                return true;
            }
        }
        return false;
    }

    Transform NextFreePosition() {
        foreach (Transform position in transform) {
            if (position.childCount <= 0) {
                return position;
            }
        }
        return null;
    }

    bool AllEnemiesAreDead () {
        foreach(Transform position in transform) {
            if (position.childCount > 0) {
            return false;
            }           
        }
        return true;
    }
}

我刚刚将宽度更改为 widthToLeft 和 widthToRight

当入侵者死亡时:

public void OnInvaderDeath() {
    float mostLeft = 10000;
    float mostRight = -10000;
    foreach( Transform invaderTransform in invaderList ) {
        if( invaderTransform.position.x < mostLeft )
            mostLeft = invaderTransform.position.x;
        if( invaderTransform.position.x > mostRight )
            mostRight = invaderTransform.position.x;
    }
    widthToLeft = mostLeft + 0.75f;
    widthToRight = mostRight + 0.75f;
}

评论

0赞 DiogoSaraiva 6/13/2015
我试过了,并进行了一些修改,因为 OnInvaderDeath 在另一个脚本上......但没有用。我会尝试适应这一点,我会很快发布通知。谢谢