【问题标题】:Unity 3D 2D Enemy PatrolUnity 3D 2D 敌人巡逻队
【发布时间】:2014-06-09 11:21:36
【问题描述】:

此代码适用于统一 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;
        }   
    }
}

【问题讨论】:

  • 那么问题出在哪里?

标签: unity3d velocity 2d-games


【解决方案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
}

【讨论】:

    【解决方案2】:

    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
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多