2014-06-09 4 views
0

이 코드는 단결 2D 게임에서 적 AI 용입니다. 지금 당장 적은 여전히 ​​서있다. 그러나 내가 IF를 모두 바꾸면, < 또는> 적들이 오른쪽 또는 왼쪽 방향으로 움직이고있다.Unity 3D 2D Enemy Patrol

적 AI 순찰 시스템을 만들려고합니다. 다른 모든 일을 마쳤습니다 (적 유도 시스템과 적을 추격하는 플레이어). 그러나이 순찰 부분 만 작동하지 않습니다.

자바 스크립트에서는 하나의 작업 순찰 코드가 있지만 모든 것이 하나의 C# 스크립트 파일 안에 있으므로 C#에서는 필요합니다.

using UnityEngine; 
using System.Collections; 

public class VastaneAI : MonoBehaviour { 

    protected Vector3 velocity; 
    public Transform _transform; 
    public float distance = 1f; 
    public float speed = 1f; 
    Vector3 _originalPosition; 

    public void Start() { 
     _originalPosition = gameObject.transform.position; 
     _transform = GetComponent<Transform>(); 
     velocity = new Vector3(speed,0,0); 
     _transform.Translate (velocity.x*Time.deltaTime,0,0); 
    } 

    public void Update(){ 
     if (transform.position.x < _originalPosition.x-distance) { 
      Debug.Log(_originalPosition.x-distance+"Left side"); 
      _transform.Translate ((1*velocity.x)*Time.deltaTime,0,0); 
     } 
     if (transform.position.x > _originalPosition.x+distance) { 
      Debug.Log(_originalPosition.x+distance+"right side"); 
      _transform.Translate (-velocity.x*Time.deltaTime,0,0); 
      //velocity = velocity*-1; 
     } 
    } 
} 
+1

그래서 무엇이 문제입니까? – Bart

답변

1

문제는 코드가 position.x가 거리보다 작거나 같지 않은 상태에서 시작한다는 것입니다. 상태 패턴을 사용하면 이것을 약간 정리할 수 있습니다.

bool isGoingLeft = false; 

void Update() 
{  
    float distFromStart = transform.position.x - _originalPosition.x; 

    if (isGoingLeft) 
    { 
     // If gone too far, switch direction 
     if (distFromStart < -distance) 
      SwitchDirection(); 

     _transform.Translate (velocity.x * Time.deltaTime, 0, 0); 
    } 
    else 
    { 
     // If gone too far, switch direction 
     if (distFromStart > distance) 
      SwitchDirection(); 

     _transform.Translate (-velocity.x * Time.deltaTime, 0, 0); 
    } 
} 

void SwitchDirection() 
{ 
    isGoingLeft = !isGoingLeft; 
    //TODO: Change facing direction, animation, etc 
} 
0

포멀릭은 코드에 약간의 변경을 가하면 작동합니다.

public class enemy : MonoBehaviour { 
protected Vector3 velocity; 
public Transform _transform; 
public float distance = 5f; 
public float speed = 1f; 
Vector3 _originalPosition; 
bool isGoingLeft = false; 
public float distFromStart; 
public void Start() { 
    _originalPosition = gameObject.transform.position; 
    _transform = GetComponent<Transform>(); 
    velocity = new Vector3(speed,0,0); 
    _transform.Translate (velocity.x*Time.deltaTime,0,0); 
} 

void Update() 
{  
    distFromStart = transform.position.x - _originalPosition.x; 

    if (isGoingLeft) 
    { 
     // If gone too far, switch direction 
     if (distFromStart < -distance) 
      SwitchDirection(); 

     _transform.Translate (-velocity.x * Time.deltaTime, 0, 0); 
    } 
    else 
    { 
     // If gone too far, switch direction 
     if (distFromStart > distance) 
      SwitchDirection(); 

     _transform.Translate (velocity.x * Time.deltaTime, 0, 0); 
    } 
} 

void SwitchDirection() 
{ 
    isGoingLeft = !isGoingLeft; 
    //TODO: Change facing direction, animation, etc 
} 
}