【问题标题】:Unity how to ignore the update function temporarily [C#]unity如何暂时忽略更新功能【C#】
【发布时间】:2016-12-17 01:40:42
【问题描述】:

我将尝试以最简单的方式解释这一点。我正在为敌方玩家制作一些 AI。如果它的光线投射击中玩家,我希望 AI 向后移动,但是我遇到了一个严重的问题。 [我将在下面的代码中解释]

代码;

using UnityEngine;
using System.Collections;

public class NewEnemyAI : MonoBehaviour 
{
    public GameObject enemy;
    public Transform target;
    public float movementSpeed = 2f;

    private CharacterController enemyCharacterController;
    private bool enemyHit;
    private Vector3 startPos;
    private Vector3 endPos;
    private float distance = 7f;
    private float lerpTime = 0.3f;
    private float currentLerpTime = 0f;
    private bool avoid;
    private bool updateOn = true;
    private bool hitPlayer = false;


    // Use this for initialization
    void Start () 
    {
        avoid = false;
    }

    // Update is called once per frame
    void Update () 
    {
        //raycasting
        if (Physics.Raycast(transform.position, transform.forward, 2))
        {
            startPos = enemy.transform.position;
            endPos = enemy.transform.position + Vector3.back * distance;
            avoid = true;
        }
        else
        {
            avoid = false;
        }

        if (avoid == true)
        {
            currentLerpTime += Time.deltaTime;
            if (currentLerpTime >= lerpTime)
            {
                currentLerpTime = lerpTime;
            }

            float perc = currentLerpTime/lerpTime;
            enemy.transform.position = Vector3.Lerp(startPos, endPos, perc);

            avoid = false;
        }

        if (avoid == false)
        {
            currentLerpTime = 0;
            transform.LookAt(target);
            transform.Translate(Vector3.forward * Time.deltaTime * movementSpeed);
        }
    }
}

当敌人的射线投射到玩家身上时,我将一个布尔值设置为 true,当它为 true 时,它​​会让玩家向后移动。然而,由于玩家正在向后移动,光线投射不再击中玩家,然后整个过程又重新开始,敌人只是橡皮筋,因为它在代码之间跳跃。有没有办法让代码忽略光线投射 if 语句并将避免布尔值永久设置为 true,直到另有说明。谢谢! [我对 C# 比较陌生,所以请不要过多批评我的代码]。

【问题讨论】:

    标签: c# variables unity3d unity5 raycasting


    【解决方案1】:

    简单修复:在 if 语句中添加计时器:

    if (Physics.Raycast(transform.position, transform.forward, 2) && timePassed(timestamp))
    

    然后就可以根据这个例子实现timePassed函数了:

    using UnityEngine;
    using System.Collections;
    
    public class ExampleClass : MonoBehaviour {
        public GameObject projectile;
        public float fireRate = 0.5F;
        private float nextFire = 0.0F;
        void Update() {
            if (Input.GetButton("Fire1") && Time.time > nextFire) {
                nextFire = Time.time + fireRate;
                GameObject clone = Instantiate(projectile, transform.position, transform.rotation) as GameObject;
            }
        }
    }
    

    来源:https://docs.unity3d.com/ScriptReference/Time-time.html

    但是,您应该考虑重构您的代码,牢记面向对象编程的规则 - 从好的资源中学习最终会带来很多好处,然后在床上设计的代码中犯错误并尝试修补它们。

    我建议您逐个阅读一些优秀的 C# 教程,并编写游戏来练习您所学的内容。

    【讨论】:

    • 我同意“冷却”的概念;它规避了许多不必要的碰撞检查和其他在适当情况下可能失败的东西。
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多