我是靠谱客的博主 粗犷小蝴蝶,最近开发中收集的这篇文章主要介绍试着在Unity中实现电学实验,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

试着在Unity中实现电学实验系统

作为一个初学者,在大创项目(VR物理实验室)中遇到的第一个挑战就是,如何在unity实现自定义组件和串联分压,并联分流?

在建完模型之后,我只能看着一堆电学部件陷入了沉思。。。。
在这里插入图片描述
所以我一个团队分工做美术的为什么还要来写程序啊喂

咳咳,言归正传。一开始想过一些方法,就是每一个模型都单独给一个脚本,里面有自己的属性方法什么的,然后导线作为连接装置,可以传递模型的电流电压。

但开始写的时候才发现。。。太反人类了!!这种想法肯定不行,得找一个更加便捷的方法。

由于每个部件的旋钮处还要判断是否有导线连接,我产生了一个绝妙的想法,就是在每一个部件的旋钮上都加一个trigger,然后统一管理,就能共用一个代码了!
就像这样
就像这样,然后给各个父物体分配标签,下面是trigger的代码

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

public class Trigger : MonoBehaviour {

    public int mark { set; get; }
    public int testmark;
    public bool used;
    public float V;
    // Use this for initialization
    void Start () {
        mark = 0;
        V = 0;
        used = false;
	}

    // Update is called once per frame
    public void OnUpdate()
    {
        testmark = mark;
	}

    private void OnTriggerStay(Collider other)
    {
        DaoXian dx = other.transform.parent.GetComponent<DaoXian>();

        if (other.transform.tag == "导线")
        {
            used = true;
            if (other.transform.name == "A")
            {
                dx.Linked_A = true;
            }else if(other.transform.name == "B")
            {
                dx.Linked_B = true;
            }
            //
            if(transform.tag == "Trigger")
            {
                if(dx.mark != 0)
                {
                    mark = dx.mark;
                }
                else
                {
                    dx.mark = mark;
                }
            }
            
            if (transform.tag == "三线接口")
            {
                dx.mark = mark;
            }
            if(transform.parent.tag == "灯泡")
            {
                dx.V = transform.parent.GetComponent<DengPao>().V;
            }
            if(transform.parent.tag == "滑动变阻器")
            {
                dx.V = transform.parent.GetComponent<HuaDong>().V;
            }
            if (transform.parent.tag == "电阻")
            {
                dx.V = transform.parent.GetComponent<DianZu>().V;
            }
            if (transform.parent.parent.tag == "电压表")
            {
                V = dx.V;
            }
        }
    }
    private void OnTriggerExit(Collider other)
    {
        if(other.transform.tag == "导线")
        {
            used = false;
        }
    }
}

mark是用来标注该trigger绑定的电学部件在哪一条线路上,方便后面计算电流电压,而大家的trigger都是为了传递mark,mark则是由三线接口发起。
组件方面就比较简单了,我让每个组件都继承一个基类

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

public class ElectricBase : MonoBehaviour {
    public GameObject PortA;
    public GameObject PortB;
    public int Transport()
    {
        if (PortA.GetComponent<Trigger>().mark != 0)
        {
            PortB.GetComponent<Trigger>().mark = PortA.GetComponent<Trigger>().mark;
            return PortA.GetComponent<Trigger>().mark;
            
        }
        else if (PortB.GetComponent<Trigger>().mark != 0)
        {
            PortA.GetComponent<Trigger>().mark = PortB.GetComponent<Trigger>().mark;
            return PortB.GetComponent<Trigger>().mark;
        }
        return 0;
    }
}

然后在各个组件里加上自己单独的属性就行了,是不是非常方便呢。

trigger和组件的代码都写完了,接下来就是管理了。我新建了ElectricManager类来专门进行管理。首先动态获取场景中的组件数,根据mark值来分组。分完组后将组类组件的电阻,滑动电阻全加起来,再用电源电压除以它,就能得到该线路的电流了。

然后传回电流表电压表,让其在两个接口不同模式下显示数据(如何让指针绕指定轴旋转一定角度停下来也折磨了我好一会,之后再分享经验)。接下来就大功告成了!!大家可以随意摆放组件,并用电线连接。只要都连上了,合上开关就能模拟电学实验了~

本来录了演示视频,但是发现上传不了,转换为gif又太大,就不演示了~基本实现了三线电路的随意搭建,组件的随意调整,电流表电压表两种模式的分别显示数据,滑动变阻器的四个接口,灯泡的亮度,开关判定等效果。之后就是与数据手套的交互进行结合了。

小白的第一篇文章,大家随便看看就行。

最后

以上就是粗犷小蝴蝶为你收集整理的试着在Unity中实现电学实验的全部内容,希望文章能够帮你解决试着在Unity中实现电学实验所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部