using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using System.Linq; public class GridController : MonoBehaviour { float worldX = 1.6F; float worldY = 1.6F; float worldZ = 1.6F; bool IsGenerated = false; float snap = 0.2F; List<Vector3> possiblePositionsList = new List<Vector3>(); List<Vector3> tempPositionsList = new List<Vector3>(); List<float> distanceList = new List<float>(); int minIndex; // Shortest distance float minVal; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } // Get closest free point in grid public Vector3 snapPoint (GameObject GroundObject, Vector3 hit){ this.transform.position = hit; Vector3 position = this.transform.position; position.x = Mathf.Round(position.x / snap) * snap; position.y = Mathf.Round(position.y / snap) * snap; position.z = Mathf.Round(position.z / snap) * snap; this.transform.position = position; Vector3 gridStart = transform.position - new Vector3(worldX / 2, worldY / 2, worldZ / 2); for(float x =0F; x<worldX; x += snap) { for(float y =0F; y<worldY; y += snap) { for(float z =0F; z<worldZ; z += snap) { Vector3 tempPosition; tempPosition = new Vector3(gridStart.x + x, gridStart.y + y, gridStart.z + z); tempPositionsList.Add(tempPosition); Debug.Log (tempPosition); // ??? } } } IsGenerated = true; foreach (Vector3 tempPosition in tempPositionsList){ Debug.Log (tempPosition); // ??? GroundObject.transform.position = tempPosition; Collider[] colliders = Physics.OverlapSphere(tempPosition, 10); foreach (Collider current in colliders){ if(current.bounds.Intersects(GroundObject.collider.bounds) == false){ possiblePositionsList.Add (tempPosition); } } colliders = null; } foreach (Vector3 possiblePosition in possiblePositionsList){ distanceList.Add(Vector3.Distance(possiblePosition, transform.position)); } minVal = distanceList.Min(); minIndex = distanceList.IndexOf(minVal); minIndex = distanceList.IndexOf(distanceList.Min()); // Debug.Log (minVal); // Debug.Log (possiblePositionsList[minIndex]); return possiblePositionsList[minIndex]; } public void Clear (){ List<Vector3> possiblePositionsList = new List<Vector3>(); List<Vector3> tempPositionsList = new List<Vector3>(); List<float> distanceList = new List<float>(); minVal = 0; } }
Muokkasin koodiani toimimaan bounds tyypillä mutta jostain syystä tämä palauttaa aina ensimmäisellä kerralla lasketun pisteen.
Olisiko aihetta siirtää (lähes) kaikki muuttujat snapPoint-metodin sisään paikallisiksi muuttujiksi tai vähintäänkin alustaa ne uudestaan? Mainittakoon myös, että Clear ei tee listoille mitään, koska luot siellä uudet paikalliset muuttujat etkä muokkaa jäsenmuuttujia lainkaan.
Toimii :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.