概述
试着在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中实现电学实验所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复