Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#, Unity: Funktio palauttaa aina saman arvon

TVdata [30.11.2014 14:14:11]

#

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.

Metabolix [30.11.2014 20:06:45]

#

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.

TVdata [30.11.2014 20:17:56]

#

Toimii :D

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta