2016-09-28 12 views
0

私は自分のプレーヤーと最も近いオブジェクトを「wall」というタグで距離を取ろうとしていますが、動作させることはできません。 私の知る限り、私のコードはまったく動いていません。 私の質問はそうです。 私は何が間違っていますか?再び、私は、プレーヤーと最も近いオブジェクトとの距離をタグ「壁」で見つけたいと思っています。私がタグ 'wall'を持つオブジェクトの近くにいる場合は、変数をtrueに設定したい(nearWall = true)とオブジェクトから離れると(約10.0f)、それをfalseに戻します。 nearWall = false)壁の距離を取得する(同じタグを持つ複数のオブジェクト)

これは私が作業しているコードです。

using UnityEngine; 
using System.Collections; 

public class PlayerMotor : MonoBehaviour { 

    private CharacterController controller; 
    private Vector3 moveVector; 
    private float speed = 2.0f; 
    private float verticalVelocity = 0.0f; 
    private float gravity = 12.0f; 

    private bool nearWall; 
    public GameObject playerObject; 

    GameObject closestObject; 

    float distance = Mathf.Infinity; 

    public float distanceToWall = Mathf.Infinity; 


    private void Start() { 
     nearWall = false; 
     playerObject = GameObject.Find("Player"); 

     distanceToWall = 0; 
     controller = GetComponent<CharacterController>(); 
    } 
    public void getNearestWall() 
    { 
     if (distance <= 10.0f) { 
      nearWall = true; 
      print ("Near wall!"); 
     } 
     else 
      nearWall = false; 
    } 
    GameObject findNearestWall() 
    { 
     GameObject[]objectArray; 
     objectArray = GameObject.FindGameObjectsWithTag("wall"); 

     Vector3 position = playerObject.transform.position; 

     foreach(GameObject currentObject in objectArray) 
     { 
      Vector3 distanceCheck = currentObject.transform.position - position;  
      float currentDistance = distanceCheck.sqrMagnitude; 

      if (currentDistance < distance) 
      { 
       closestObject = currentObject; 

       distance = currentDistance; 

      } 
     } 

     return closestObject; 
    } 
    private void Update() 
    {   
     findNearestWall(); 
     moveVector = Vector3.zero; 
     if (controller.isGrounded) 
     { 
      verticalVelocity = -0.5f; 
     } 
     else 
     { 
      verticalVelocity -= gravity * Time.deltaTime; 
     } 
     if (Input.GetMouseButton (0)) { 
      if (!nearWall) { 
       if (Input.mousePosition.x > Screen.width/2) 
        moveVector.x = speed; 
       else 
        moveVector.x = -speed; 
      } 
      else 
      { 
       moveVector.x = transform.forward.x * speed; 
       transform.Rotate(new Vector3(0, -90, 0)); 
      } 
     } 
     moveVector.y = verticalVelocity; 
     moveVector.z = transform.forward.z * speed; 
     controller.Move (moveVector * Time.deltaTime); 
    } 
} 
+0

たぶん、あなたは、アレイ内のすべてのゲームオブジェクトを格納する必要はありません。距離を測定するためにレイキャストを使用して試してみて、それがある場合はプレイヤーの位置からまたは画面外から行うことができます一人称ゲーム。 –

答えて

0

getNearestWall()メソッド(実際にはフラグを変更しています)をどこでも呼び出していないということがあります。 そして第二には、なぜあなたはちょうどしようとしないでください:

currentDistance = Vector3.Distance(currentObject.transform.position, position); 

距離

0

あなたは(当然のfindNearestWall()後)Update()メソッド内getNearestWall();を呼び出すために必要なすべての最初を計算する場合。あなたが今やっていることは、ゲーム全体でプレイヤーが到達した最小距離を得ることです。 はまた、あなたがアップデートでFindObjectsWithTag()を呼び出している:あなたが壁に近づくたび

GameObject findNearestWall() 
{ 
    GameObject[] objectArray; 
    objectArray = GameObject.FindGameObjectsWithTag("wall"); 
    distance = Mathf.Infinity; 
    Vector3 position = playerObject.transform.position; 

    foreach (GameObject currentObject in objectArray) 
    { 
     Vector3 distanceCheck = currentObject.transform.position - position; 
     float currentDistance = distanceCheck.sqrMagnitude; 

     if (currentDistance < distance) 
     { 
       closestObject = currentObject; 
       distance = currentDistance;    
     } 
    } 

    return closestObject; 
} 

今ではNear wall!

ノートを印刷する必要があります:あなたはそれがこのようなものでしょうfindNearestWall()の上部にdistance = Mathf.Infinity;を追加したい場合があります処理能力を大幅に低下させる可能性があります。クラス内でプライベートなGameObject[] objectArrayを宣言することでそれを避けたいかもしれません。 その後、一度objectArray = GameObject.FindGameObjectsWithTag("wall");を使用Awake()Start()

関連する問題