[英]Unity 3D 2D Enemy Patrol
該代碼適用於統一2D游戲中的敵方AI。 現在,敵人靜止不動,但是如果我同時改變IF,s或<>,那么敵人將向右或向左移動,僅此而已。
我正在嘗試建立敵方AI巡邏系統。 完成了其他所有操作(敵人觸發系統和敵人追逐玩家),但是僅此巡邏部分不起作用。
我在javascript中得到了一個有效的巡邏代碼,但是我在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;
}
}
}
問題是您的代碼從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
}
Formic是正確的,只需對他的代碼做些微小的更改,這將起作用。
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.