unity里如何隐藏物体实现延时显示

方法一:update计时器实现

1、操作: 新建一个空物体cube和Cubepanel,隐藏cube,脚本挂在cube上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class activeShow : MonoBehaviour {

    public GameObject cube;
    string message = null;
    private float m_timer=0;

    // Use this for initialization
    void Start () {
        Recv();
    }
    
    // Update is called once per frame
    void Update () {
        m_timer+=Time.deltaTime;
        if(message == "update_panel" && m_timer>5){
            cube.active = !cube.active;
            m_timer=0;
        }
    }
    
    public void Recv()
    {

        while (true)
        {
            int[] recv = new int[];
            int recvLen = socket.ReceiveFrom(recvData, ref endPoint);
            message = Encoding.UTF8.GetString(recvData, 0, recvLen);
        }
    }
}
  • 缺点:用了这个时间的延迟,会变得频显示和隐藏,效果很差。

2、Time.deltaTime:

(1)应用一:位移

描述

  • 按照秒来计数,完成最后一帧的时间(只读)。通常,使用 这个函数来产生与游戏帧速率无关的效果。

  • 如果你加上或者减去一个值,那你很可能应该乘以 Time.deltaTime.当你乘以它以后,你实质上的表达式是:

我想让这个物体以每秒钟10米的速度 移动而不是每帧10米。

using UnityEngine;
using System.Collections;

public class doorManager : MonoBehaviour {
    bool doorisopen = false;
    public AudioClip door_open_sound;
    public AudioClip door_shut_sound;   
    float doortimer = 0.0f;
    public float dooropentime = 3.0f;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if(doorisopen){
            doortimer += Time.deltaTime;
            if(doortimer > dooropentime){
                door(false, door_shut_sound , "closeDoor");
                doortimer = 0.0f;
            }
        }
    }

    void DoorCheck(){
        if(!doorisopen){
            door(true, door_open_sound , "openDoor");
        }
    }

    void door(bool doorcheck, AudioClip a_clip, string anim_name){
        doorisopen = doorcheck;
        this.GetComponent<AudioSource>().PlayOneShot(a_clip);
        this.transform.parent.GetComponent<Animation>().Play(anim_name);    
//      this.GetComponent<Animation>().Play(anim_name);
    }
}

Update函数里的代码

  void Update () {
        if(doorisopen){
            doortimer += Time.deltaTime;
            if(doortimer > dooropentime){
                door(false, door_shut_sound , "closeDoor");
                doortimer = 0.0f;
            }
        }
    }

✅显然,Time.deltaTime是按照每秒来统计的。

✅总结:Update( )的刷新是按照每帧来显示的,但是Time.deltaTime是按照秒来统计的。

(2)应用二:计时

private float timer = 0f;
public int frameNumber = 10;//每秒的帧数
public int frameCount = 0;//帧数的计时器
private Renderer rend; 
void Update()
    {
        /*Time.deltaTime是渲染完上一帧(系统的帧)用的时间,用timer+=就是为了
          使这些(每个Time.deltaTime)累加起来,
          如果大于你设定的每帧需要的时间( 1f/frameNumber),则需要去执行下一帧画面
        */
        timer += Time.deltaTime;//这个timer是为了累加起来看 是不是大于 你设定的执行下一帧的时间
        if ( timer > 1f/frameNumber)
        {
            frameCount++;
            timer = 0f;
            int frameIndex = frameCount  % 3;//限制索引
            rend.material.SetTextureOffset ("_MainTex",new Vector2(frameIndex*0.3333333f,0));
            //一共三帧
        }

    }

控制台输出结果:

unity里如何隐藏物体实现延时显示

方法二:增加控制变量flag

改进写法:

public class activeShow : MonoBehaviour {

    public GameObject cube;
    string message,message_new = null;
    private float m_timer=0;
    bool flag = false;
    void Start()
    {
        cube = GameObject.Find("/Cubepanel");

    }
    void Update()
    {
        
     if (message_new == "update_panel" && flag == true)   
        {
           
           cube.active = !cube.active;
            flag = false;
        }
    }
         
     public void Recv()
    {

        while (true)
        {
            int[] recv = new int[];
            int recvLen = socket.ReceiveFrom(recv, ref endPoint);
            str = Encoding.UTF8.GetString(recv, 0, recvLen);
            if(message != message_new)
            {
                flag = true;
                message_new = message;
            }
        }
    }
}

原理:

  • 在Recv方法里会接收到很多数据,如果这些数据一直是一个状态(相同的信息),flag就等于false,就不会隐藏或调出界面。
  • 只有当message != message_new,flag才会为true,此时要看message_new 是否等于"update_panel",如果不是,也不会隐藏或调出界面。
  • 当message_new == “update_panel” && flag == true同时的满足情况下,会执行隐藏或调出界面的功能。

优点:

  • 解决了之前加时间的延迟,会太闪太快,频繁隐藏或调出界面。
  • 增加了条件的限制,可以灵敏的隐藏或调出界面。
上一篇:C++面向对象入门--简单的实现立方体类


下一篇:Unity学习笔记(04):transform、Find/FindChild、GetChild、deltaTime、方向向量、坐标转换、缩放、旋转、LookAt、Quaternion、Vector3