unity初步学习开发日志(一)

本文记录了解决Unity项目中关于NPC对话计时、敌人刷新和武器穿透等问题的过程,强调游戏时间管理在多任务处理中的重要性,并提出简化代码结构的改进措施。
摘要由CSDN通过智能技术生成

#’仅以此文记录我学习unity中的问题和进程#

#学习案例一:基于unity——Ruby案例中的修改和扩展#

记录时间“2024/3/19”

一.今日问题:

1.任务出现图层时衔接bug(后续任务图片不显示); 

public class NPCdialog : MonoBehaviour
{

    public GameObject dialogBox;
    public GameObject dialog_warming;
    public float displayTime_one = 4.0f;
    public float displayTime_two = 4.0f;
    public float timerDisplay;
    public Text dialogText;
    public AudioSource audioSource;
    public AudioClip completeTask;
    private bool hasplaed;


    // Start is called before the first frame update
    void Start()
    {
        dialogBox.SetActive(false);
        timerDisplay = -1;
    }

    // Update is called once per frame
    void Update()
    {
        if (timerDisplay >= 0)
        {
            timerDisplay-= Time.deltaTime;
            if (timerDisplay <= 0)
            {
                displayTime_two = 4;
                dialog_warming.SetActive(false);
                dialogBox.SetActive (false);
                UIhealthbar.instance.ifCompleteTask_One = true;
            }
        }
    }

    public void DisplayDialog()
    {
        timerDisplay = displayTime_one; 
        dialogBox.SetActive(true);
        UIhealthbar.instance.hasTask=true;
        if (UIhealthbar.instance.fixNum>=1)
        {
            dialogText.text = "你怎么又回来了?" +
                "你还想要报酬吗?这可是你的工作啊!";  //完成任务
            if (!hasplaed)
            {
                hasplaed = true;
                audioSource.PlayOneShot(completeTask);
                UIhealthbar.instance.ifCompleteTask_Two = true;
                displayTime_two=displayTime_two-Time.deltaTime;
                
                if (displayTime_two<=0)
                {
                    dialog_warming.SetActive(true);
                }
            }
            
        }
        else if(UIhealthbar.instance.ifCompleteTask_One== true)                      //待完成
        {
            dialogText.text = "还盯着我干什么?" +
                "去工作啊!"+"去把那些机器人修好很难吗?";
        }
    }
}

问题:在设定了任务倒计时和物体失活后,界面ui图片触发是无法响应且出现的,测试发现去除任务倒计时,前一任务完成时能图层能正常出现。

解决方法&&问因:没有设定好时间变量随着游戏时间改变,只在第一帧发生变化。

代码部分

public class NPCdialog : MonoBehaviour
{

    public GameObject dialogBox;
    public GameObject dialog_warming;
    public float displayTime_one = 4.0f;//一号赋值器
    public float displayTime_two;//任务结束到ui对话框显示的中间时间
    public float timerDisplay;  //一号计时器——npc角色谈话框停留时间
    public float timerDisplay_one; //二号计时器——ui界面话框停留计时器

    public Text dialogText;
    public AudioSource audioSource;
    public AudioClip completeTask;
    private bool hasplaed;


    // Start is called before the first frame update
    void Start()
    {
        dialogBox.SetActive(false);
        timerDisplay = -1;
        timerDisplay_one = 6;
    }

    // Update is called once per frame
    void Update()
    {
        if (timerDisplay >= 0)
        {
            timerDisplay -= Time.deltaTime;
            if (timerDisplay <= 0)
            {
                displayTime_two = 4;
                dialog_warming.SetActive(false);
                dialogBox.SetActive(false);
                UIhealthbar.instance.ifCompleteTask_One = true;
            }
        }
        if (displayTime_two >= 0&&UIhealthbar.instance.ifCompleteTask_Two == true)
        {
            displayTime_two -= Time.deltaTime;
            WarmingDialogWay();
            
        }
        if (displayTime_two <= 0)
        {
            timerDisplay_one -= Time.deltaTime;
            if (timerDisplay_one <= 0)
            { dialog_warming.SetActive(false); }
        }

    }

    public void DisplayDialog()
    {
        timerDisplay = displayTime_one; 
        dialogBox.SetActive(true);
        UIhealthbar.instance.hasTask=true;
        if (UIhealthbar.instance.fixNum>=1)
        {
            dialogText.text = "你怎么又回来了?" +
                "你还想要报酬吗?这可是你的工作啊!";  //完成任务
            if (!hasplaed)
            {
                hasplaed = true;
                audioSource.PlayOneShot(completeTask);
                UIhealthbar.instance.ifCompleteTask_Two = true;
            }
            
        }
        else if(UIhealthbar.instance.ifCompleteTask_One== true)                      //待完成
        {
            dialogText.text = "还盯着我干什么?" +
                "去工作啊!"+"去把那些机器人修好很难吗?";
        }
    }
    private void WarmingDialogWay()
    {
        if (displayTime_two <= 0)
        {
            dialog_warming.SetActive(true);
  
        }
    }
}

改进于结论:游戏时间是关键,当大量延时任务的代码出现时需要时刻关注有关每一帧的方法“update()”。此次问题就在于update中上一任务已经完成,不再执行。而后续的计时器代码居然在吃条件下(作者着实有够蠢的)

为了成功运行,当前if的嵌套过多,需要更多的改进,如果脚本过多将导致代码中的变量过多,看起来非常繁杂和混乱。下次可以尝试建立一个独立的时间类或方法来作为专门的计时器方法。

******************************

2.敌人的数量堆积出现bug;

private void Update()
{

    
        if (UIhealthbar.instance.ifCompleteTask_Two == true&&clone_key==false)
        {
            waitenamycreat_Time = waitenamycreat_Time - Time.deltaTime;
            if (waitenamycreat_Time < 0)
            {                
                StartCoroutine(Clone());
                clone_key = true;  
            }
        }

问题原因:如图,在update方法中,将会反复执行克隆方法clone(),导致按帧率重复刷新敌人,

************************************

3.一次武器能穿透攻击多个敌人bug;目前暂无更好的解决办法,只能通过调节层级让敌人之间不发生碰撞从而使武器一次击中一名敌人。

************************************

怪物过多导致的音频限制;

技术原因,暂无解决方法~

二.今日完成:

1,0.1版本的简单初次任务调试完成

2,暂时完善了敌人的刷新问题。

3.音乐播放器随任务开始

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值