1.搭建ui,在Canvas中新建一个panel,新建两个InputField,作为两个输入框,获取输入的数值。新建四个button组件作为点击的按钮。新建一个Text组件作为计算结果的展示。界面搭建完成如下图

2.编写代码

using System;
using UnityEngine;
using UnityEngine.UI;namespace JiSuanQi.UI
{public class JISuanQiPanel : MonoBehaviour{public Button mBtnJiaFa, mBtnJianFa, mBtnChengFa, mBtnChuFa;public Text mResult;public InputField mInputNumA;public InputField mInputNumB;private void Awake(){mBtnJiaFa.onClick.AddListener(JiaFa);mBtnJianFa.onClick.AddListener(JianFa);mBtnChengFa.onClick.AddListener(ChengFa);mBtnChuFa.onClick.AddListener(ChuFa);}private void JiaFa(){double result = Operation(0);UpdateResult(result);}private void JianFa(){double result = Operation(1);UpdateResult(result);}private void ChengFa(){double result = Operation(2);UpdateResult(result);}private void ChuFa(){double result = Operation(3);UpdateResult(result);}private double Operation(int index){if (string.IsNullOrEmpty(mInputNumA.text)||string.IsNullOrEmpty(mInputNumB.text)){return -1;}double NumA = double.Parse(mInputNumA.text);double NumB = double.Parse(mInputNumB.text);switch (index){case 0:return NumA + NumB;case 1:return NumA - NumB;case 2:return NumA * NumB;case 3:if (NumB == 0){return -1;}else{return NumA / NumB;}default:return -1;}}private void UpdateResult(double result){mResult.text = "结果:" + result;}}
}

ui组件使用拖拽的方式进行赋值。ui组件赋值的方式一种是使用代码查找transform.Find("组件的ui面板路径").getComponent<组件类型>();在Awake或者Start方法中初始化。我比较喜欢拖拽的方式赋值。因为界面是经常改动的东西,使用的拖拽的方式赋值,如果ui删除了,代码部分并不需要修改。如果使用代码查找的方式,组件删除了,代码里查找的部分就会报错,会牵扯到代码部分的修改。不过用代码查找的方式可以在脚本中看到完整的方法绑定逻辑。容易阅读。

以上简单的加减乘除代码就完成了,开发中这种方式是最容易想到的,一个界面里就实现了所有的功能。

3.以上代码功能正常,但是是有问题的。界面业务逻辑都掺杂在一起了。但是界面会有很多种,如果现在新增了一个界面,同样要使用加减乘除的业务逻辑,但是界面不是计算器的界面。这时候就要重新写一边计算的逻辑,如果以后计算的逻辑改变了,那么两个界面都要修改计算的逻辑,这样既会增加工作量,还不能保证每次修改都是一样的,导致bug的产生。如果说现在要使用gui来实现同样的计算器功能,同样要把界面业务逻辑,复制一份到gui的代码中。每次更换ui界面的时候都会遇到同样的问题。

4.代码优化:ui逻辑业务逻辑实现分离

ui界面逻辑:

using System;
using UnityEngine;
using UnityEngine.UI;namespace JiSuanQi.UI
{public class JISuanQiPanel : MonoBehaviour{public Button mBtnJiaFa, mBtnJianFa, mBtnChengFa, mBtnChuFa;public Text mResult;public InputField mInputNumA;public InputField mInputNumB;private TestOperation mOperation;private void Awake(){mOperation = new TestOperation();mBtnJiaFa.onClick.AddListener(JiaFa);mBtnJianFa.onClick.AddListener(JianFa);mBtnChengFa.onClick.AddListener(ChengFa);mBtnChuFa.onClick.AddListener(ChuFa);}private void JiaFa(){double result = Operation(0);UpdateResult(result);}private void JianFa(){double result = Operation(1);UpdateResult(result);}private void ChengFa(){double result = Operation(2);UpdateResult(result);}private void ChuFa(){double result = Operation(3);UpdateResult(result);}private double Operation(int index){if (string.IsNullOrEmpty(mInputNumA.text)||string.IsNullOrEmpty(mInputNumB.text)){return -1;}double NumA = double.Parse(mInputNumA.text);double NumB = double.Parse(mInputNumB.text);return mOperation.GetResult(NumA, NumB, index);}private void UpdateResult(double result){mResult.text = "结果:" + result;}}
}

业务逻辑:

namespace JiSuanQi
{public class TestOperation {public double GetResult(double NumA,double NumB,int index){switch (index){case 0:return NumA + NumB;case 1:return NumA - NumB;case 2:return NumA * NumB;case 3:if (NumB == 0){return -1;}else{return NumA / NumB;}default:return -1;}}}
}

把业务逻辑提取到了新的类TestOperation中,这样业务逻辑就抽取出来了。

以上代码,计算功能正常。

4.代码存在的问题:TestOperation类中维护了所有的计算逻辑。如果说后面新增了其他计算逻辑,如开根,求余数,等新的计算逻辑,或者对加减乘除的逻辑进行特殊的修改,都会牵扯到TestOperation类的修改,这样如果Operation类中出现了错误,会导致计算功能异常。并且不能保证每次修改都不会影响已使用的功能。因为修改的是TestOperation这个类。

5.代码优化:

using UnityEngine;namespace JiSuanQi
{public abstract class Operation{public double NumberA;public double NumberB;public abstract double GetResult();}
}namespace JiSuanQi
{public class OperationAdd:Operation{public override double GetResult(){return NumberA + NumberB;}}
}namespace JiSuanQi
{public class OperationReduce:Operation{public override double GetResult(){return NumberA - NumberB;}}
}namespace JiSuanQi
{public class OperationChengFa:Operation{public override double GetResult(){return NumberA * NumberB;}}
}namespace JiSuanQi
{public class OperationChuFa:Operation{public override double GetResult(){return NumberA / NumberB;}}
}
using System.Collections;
using System.Collections.Generic;
using JiSuanQi;
using UnityEngine;public class SimpleFactory
{public static Operation CreateOperate(int index){switch (index){case 0:return new OperationAdd();case 1:return new OperationReduce();case 2:return new OperationChengFa();case 3:return new OperationChuFa();default:return null;}}
}

业务逻辑优化,将Operation类提取出来,加减乘除的操作作为一个对象,Operation类作为操作的基类,基类只要持有NumA和NumB两个字段和一个GetResult方法即可。具体的实现由字类重写。实现不同的逻辑。

SimpleFactory类。属于对象创建的工厂。根据输入的index不同,实例化不同的Operation。如果后期有修改,只需要修改对应的字类即可。

使用unity实现计算器功能相关推荐

  1. android实现计算器功能吗,利用Android实现一个简单的计算器功能

    利用Android实现一个简单的计算器功能 发布时间:2020-11-20 16:25:01 来源:亿速云 阅读:90 作者:Leah 今天就跟大家聊聊有关利用Android实现一个简单的计算器功能, ...

  2. python表达式计算器_Python正则表达式实现简易计算器功能示例

    本文实例讲述了Python正则表达式实现简易计算器功能.分享给大家供大家参考,具体如下: 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:1*2*((1+2)/(2+3)+ ...

  3. 使用jquery实现的计算器功能

    晚上做了一个jQuery的项目,使用jQuery实现了一个简单的计算器功能,可以实现连加,连减,混合计算,括号内优先计算,代码如下: css部分: 1 <style> 2 .main{ 3 ...

  4. python实现简单计算器功能键介绍_Python实现的简单计算器功能详解

    本文实例讲述了Python实现的简单计算器功能.分享给大家供大家参考,具体如下: 使用python编写一款简易的计算器 计算器效果图 首先搭建计算器的面板: 计算器面板结构 建造一个继承于wx.Fra ...

  5. java swing实现计算器_Java swing实现的计算器功能完整实例

    本文实例讲述了Java swing实现的计算器功能.分享给大家供大家参考,具体如下: package awtDemo; import java.awt.*; import java.awt.event ...

  6. python调用计算器卡死_Python+tkinter使用40行代码实现计算器功能

    本文实例为大家分享了40行Python代码实现计算器功能,供大家参考,具体内容如下 偶尔用脚本写点东西也是不错的. 效果图 代码 from tkinter import * reset=True de ...

  7. formula 返回list_python正则实现计算器功能

    本文实例为大家分享了python正则实现计算器功能的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- # Author :Gogh # @Time :2017/12/ ...

  8. java web编写计算器_javaWeb 使用 jsp 和 javaBean 实现计算器功能

    jsp 和 javaBean 实现计算器功能 try { calculator.calculate(); } catch (Exception e) { out.write(e.getMessage( ...

  9. 用统计功能计算机计算js,js实现计算器功能

    本文实例为大家分享了js实现计算器功能的具体代码,供大家参考,具体内容如下 知识点 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 代码如下 js计算器 计算器 .h ...

最新文章

  1. 酷炫的深度学习网络图怎么绘制出来的?
  2. linux shell putty 无法使用 home end 键
  3. CVPR 2019 | 全新缺失图像数据插补框架—CollaGAN
  4. html换行符_HTML 列表
  5. pyspark对应的scala代码PythonRDD对象
  6. 大数据分析平台的安全如何保障
  7. L1-053 电子汪 (10 分)—团体程序设计天梯赛
  8. bootice添加黑苹果引导_2019款小米air12.5完美黑苹果10.15.6EFI
  9. 设计测测试用例的五大方法
  10. 二维码是什么?java生成二维码
  11. 台式计算机快捷键大全,台式电脑截图快捷键是哪一个?(电脑快捷键使用大全)...
  12. 计算机视觉论文-2021-09-06
  13. uefi装完系统后无法引导_不重装系统修改引导方式为UEFI模式
  14. python for data analysis 操作usagov_bitly_data示例
  15. 【图神经网络】图神经网络(GNN)学习笔记:图分类
  16. (三)Shi-Tomasi角点检测
  17. 嵌入式编程 交通灯显示
  18. ESP32-C3 flash encryption secure boot
  19. 学平面UI设计选择哪个培训机构好
  20. 高精度加法【c++实现】

热门文章

  1. NEFU 大一寒假训练六(二分查找)题目预测
  2. 【实验】阿里云大数据助理工程师认证(ACA)- 机器学习实现基本统计分析
  3. 获取晋江优质小说(按章节数量选择、python多进程)
  4. php微信二维码签到墙互动,微久信微信墙2017全新版本教程第二篇:微信签到/扫码3D签到/微信手绘签到...
  5. 西门子KTP二代精简触摸屏点击无反应,触摸失效的处理对策
  6. 给猜字游戏增加难度设置
  7. Learning to Track with Object Permanence阅读笔记
  8. 抖音小店无货源玩法分享(五)抖店类目该如何选择
  9. 打字游戏c语言easyx,打字小游戏(天降字母)Visual Studio+EasyX
  10. Three.js入门——画星空(star field)