unity如何暂时忽略更新功能【C#】

Posted

技术标签:

【中文标题】unity如何暂时忽略更新功能【C#】【英文标题】:Unity how to ignore the update function temporarily [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# 比较陌生,所以请不要过多批评我的代码]。

【问题讨论】:

【参考方案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# 教程,并编写游戏来练习您所学的内容。

【讨论】:

我同意“冷却”的概念;它规避了许多不必要的碰撞检查和其他在适当情况下可能失败的东西。

以上是关于unity如何暂时忽略更新功能【C#】的主要内容,如果未能解决你的问题,请参考以下文章

Unity游戏开发 | 浅谈Lua和C#中的闭包

Unity2018新功能抢鲜 C# Job System(2)

c#和Unity,更新已更改为CSV文件的记录

(C# & Unity) 脚本语言 ES

解构Unity的腳本物件模型

Unity C# 从字节加载图像