2014-12-28 2 views
0

나에게 어떤 문제가 있는지 알려주실 수 있습니까? 플레이어가 레이 캐스트 범위 내에있을 때 볼 수 있으면 알 수 있습니다. 적군이 빨갛게 변합니다. 하지만 웬일인지. 플레이어가 적을 적색으로 만들기위한 요구 사항을 충족시킬 때에도. 다시 흰색으로 바뀝니다. 이것은 수동으로 움직일 때만 보이며 보통 속도로 깜박이는 것처럼 보입니다.Raycast가 감지되지 않을 때

나는 이것이 일어나는 이유가 레이캐스팅 중 하나가 더 이상 요구 사항을 충족시키지 않는다고 생각합니다. 아마 뭔가 관련이있을거야. 나는 정확하게 모른다. 그래서이 문제를 해결하도록 도와주세요.

미리 감사드립니다.

enter image description here

이 사진은 보여줍니다 플레이어가 적군이 붉은 만드는의 요구 사항 내 경우에도. 그것은 doesnt한다. 왜 ?

using UnityEngine; 
using System.Collections; 

/* TL = Top Left 
* TR = Top Right 
* BL = Bottom Left 
* BR = Bottom Right 
*/ 

public class Script_v2 : MonoBehaviour { 

    // Player Properties 
    private GameObject player; 
    public Vector3 playerSize; 
    private Vector3 playerTransform; 
    public Vector3 playerTransformTL; 
    public Vector3 playerTransformTR; 
    public Vector3 playerTransformBL; 
    public Vector3 playerTransformBR; 

    private Vector3 newPlayerTransformTL; 
    private Vector3 newPlayerTransformTR; 

    private Vector3[] playerRaycastPoints; 


    // Enemy Properties 
    private Vector3 enemyTransformTL; 
    private Vector3 enemyTransformTR; 
    private Vector3 enemyTransformBL; 
    private Vector3 enemyTransformBR; 

    public float distance; 
    public Vector3 enemySize; 

    // Detection Alerts 
    public bool alerted; 
    public bool alertedLock; 
    public bool dead; 

    Ray ray; 
    RaycastHit hit; 

    // Use this for initialization 
    void Start() { 
     playerRaycastPoints = new Vector3[4]; 

     distance = 3f; 
     player = GameObject.FindGameObjectWithTag ("Player"); 


    } 

    // Update is called once per frame 
    void Update() { 

     enemyTransformTL = new Vector3 (transform.position.x - 0.5f, transform.position.y + 0.5f, transform.position.z); 
     enemyTransformTR = new Vector3 (transform.position.x + 0.5f, transform.position.y + 0.5f, transform.position.z); 


     enemyTransform_TL_TR(); 
     detectionAlert(); 
     Reference_Player_Transform_Points(); 
     Player_Transform_Points_Detection(); 



    } 

    void OnDrawGizmos() { 
     Gizmos.color = Color.blue; 
     Gizmos.DrawWireSphere (new Vector3(transform.position.x - 0.5f, transform.position.y + 0.5f, transform.position.z), distance); 
     Gizmos.DrawWireSphere (new Vector3(transform.position.x + 0.5f, transform.position.y + 0.5f, transform.position.z), distance); 
    } 

    public void enemyTransform_TL_TR() { 

     for (int i = 0; i < 4; i++) { 

      double enemyAngleTL = Mathf.Atan2(playerRaycastPoints[i].y - (transform.position.y + 0.5f), 
               playerRaycastPoints[i].x - (transform.position.x - 0.5f)) * 180f/3.14159265f; 
      Debug.Log (enemyAngleTL); 
      double enemyAngleTR = Mathf.Atan2 (playerRaycastPoints[i].y - (transform.position.y + 0.5f), 
               playerRaycastPoints[i].x - (transform.position.x + 0.5f)) * 180f/3.14159265f; 

      Vector3 directionTL = (playerRaycastPoints[i] - enemyTransformTL).normalized; 
      Ray rayTL = new Ray(enemyTransformTL, directionTL); 
      RaycastHit hitTL; 
      Vector3 directionTR = (playerRaycastPoints[i] - enemyTransformTR).normalized; 
      Ray rayTR = new Ray (enemyTransformTR, directionTR); 
      RaycastHit hitTR; 


      //Debug.DrawRay (rayTR.origin, rayTR.direction * distance, Color.yellow); 

      if(Physics.Raycast (rayTL, out hitTL, distance)) { 
       if((enemyAngleTL > 90 && enemyAngleTL < 180)) { 
        Debug.DrawRay (rayTL.origin, rayTL.direction * distance, Color.yellow); 
        alerted = true; 

       } 

      } 
      else { 
       alerted = false; 
      } 


     } 


    } 

    public void detectionAlert() { 
     if (alerted == true) { 
      gameObject.renderer.material.color = Color.red;  
     } 
     else { 
      gameObject.renderer.material.color = Color.white; 
     } 
    } 

    private void Reference_Player_Transform_Points() { 

     playerSize = player.transform.localScale; 

     playerTransformTL = new Vector3(player.transform.position.x - (playerSize.x/2), 
             player.transform.position.y + playerSize.y/2, 
             player.transform.position.z); 
     playerTransformTR = new Vector3(player.transform.position.x + (playerSize.x/2), 
             player.transform.position.y + playerSize.y/2, 
             player.transform.position.z); 
     playerTransformBL = new Vector3(player.transform.position.x - (playerSize.x/2), 
             player.transform.position.y - playerSize.y/2, 
             player.transform.position.z); 
     playerTransformBR = new Vector3(player.transform.position.x + (playerSize.x/2), 
             player.transform.position.y - playerSize.y/2, 
             player.transform.position.z); 

     playerRaycastPoints [0] = playerTransformTL; 
     playerRaycastPoints [1] = playerTransformTR; 
     playerRaycastPoints [2] = playerTransformBL; 
     playerRaycastPoints [3] = playerTransformBR; 

    } 



} 
+0

스크립트의 일부가 Player_Transform_Points_Detection() 메소드에서 누락되었습니다. – benblo

답변

0

나는 철저하게 전체를 읽어 보지 않았하지만 뭔가 수상한 냄새, 여기 간다 : (색상) 당신의 상태는 지금까지 enemyTransform_TL_TR에 영향을받는 "경고"부울에 따라 달라집니다().

플레이어 상자의 정점 4 개 (2D 오른쪽?), (for 루프)에 (악취가 나는 부분)으로 전송 중입니다.

캐스팅이 성공하면 경고음이 켜지지만 for가 실패하면 경고음이 울립니다. 어쩌면 당신은 for 루프 전에 경고를 내야 만합니다. 그리고 성공한 첫 번째 캐스트에서 그것을 켜고 중단하십시오. 내가 말했다으로,보다

if (Physics.Raycast(rayTL, out hitTL, distance)) 
    { 
     if ((enemyAngleTL > 90 && enemyAngleTL < 180)) 
     { 
     Debug.DrawRay(rayTL.origin, rayTL.direction * distance, Color.yellow); 
     alerted = true; 
     } 
     // else: what then? should alerted be false? here's you're just leaving it as is... 
    } 
    else 
    { 
     alerted = false; 
    } 

기타 :

또한, 나는 당신이 사례 중 하나 (내 "다른"설명을 참조) 처리하지 않는, 그 캐스트의 모습을 좋아하지 않는다 귀하의 스크립트가 상자 밖으로 컴파일되지 않은 주석, Player_Transform_Points_Detection() 메서드가 누락되었습니다.

그리고 코드에서 일부 정리를 사용할 수 있습니다. 사용되지 않은 변수, 메소드 및 변수가 명백한 이유로 공개되지 않았습니다.

더 많은 정보를 캐시해야합니다. Reference_Player_Transform_Points()처럼 player.transform.position 번 12 번 수행해야합니다. 매번 엔진에서 효과적으로 위치를 잡아 당기고있다. var playerPos = player.transform.position; 한 번만 가져오고 playerPos을 사방에 사용하십시오. 같은 장소에 playerRaycastPoints[i]와 동일합니다. 코드가 더 빨라지고 훨씬 더 읽기 쉽습니다.

또한 playerSize를 2로 4 배로 나눕니다. 단 한번만 할 수 있습니다. (그리고 0.5f를 곱하면됩니다. 왜냐하면 나누기가 값 비싸기 때문에 곱셈을하는 것이지만 컴파일러가 어쨌든 그것을 할 수 있기 때문입니다. 확실하지 않습니다.)

180f/3.14159265f 대신 또는 Mathf.PI 대신 Mathf.Rad2Deg을 사용할 수 있습니다.

시작 필드()에서 초기화하는 대신 직접 private Vector3[] playerRaycastPoints = new Vector3[4]; 필드를 초기화 할 수 있습니다.

... 이제 중단하겠습니다.

+0

감사합니다.네가 한 말에 진심으로 감사한다. 정말 고마워! 하하,하지만, 음, 나는이 문제를 해결하고 경고했다. for 루프 바깥 쪽. 그리고 누락 된 기능입니다. 나는 그것이 더 이상 필요하지 않았기 때문에 전체 기능을 제거한 업데이트 원인에서 그것을 제거하는 것을 잊어 버렸습니다. 만약 당신이 내게 도와주세요 수 : http://gamedev.stackexchange.com/questions/90368/problems-with-raycasting-requirements/90460#90460 – JekasG

+0

아무 문제 없습니다. 그것이 도움이된다면 답을 받아 들여야한다는 것을 잊지 마십시오. 내일 다른 질문을 확인할 수 있는지 알게 될 것입니다. – benblo

+0

고마워요, 새해 복 많이 받으세요^^ – JekasG

관련 문제