用【Unity】中的【3D Object】画【数学函数】图形 —— 正弦函数... { }
效果

场景搭建
创建一个空物体,并将其命名为 “GameManager”,并【Reset】它

创建一个 “Sphere”,并将其【Scale】设置为(0.1,0.1,0.1)

创建一个 “Cube”,并将其【Scale】设置为(0.1,0.1,0.1)

创建一个 “Material”,并将其命名为 “line”,设置其颜色为黑色,并把它拖到【Cube】上


把 Sphere 和 Cube 拖到事先创建好的 “Prefabs” 文件夹中使其变成一个【预制体】,然后把场景中的物体删除

把 “DrawCurve” 脚本拖拽到 “GameManager” 物体上,并把两个预制体拖到相应的变量槽上

源码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawCurve : MonoBehaviour
{
// 余弦函数曲线的方块
[SerializeField] private GameObject spherePrefab;
// 坐标轴的方块
[SerializeField] private GameObject linePrefab;
[SerializeField] private float k = 5f;
private float x = 0f;
private float y = 0f;
private float posX = 0f;
private float posY = 0f;
private ArrayList list = new ArrayList();
private int destroyIndex = 0;
void Start()
{
// 纵坐标
for (int i = 0; i < 100;i++ )
{
GameObject obj = Instantiate(linePrefab, transform.position, Quaternion.identity);
obj.transform.position = new Vector3(0, posY, 1f);
posY += 0.1f;
}
// 横坐标
for (int i = 0; i < 100; i++)
{
GameObject obj = Instantiate(linePrefab, transform.position, Quaternion.identity);
obj.transform.position = new Vector3(posX, 0, 1f);
posX += 0.1f;
}
}
void Update()
{
if (Input.GetKey(KeyCode.A))
{
// 计算位置
x += 0.1f;
y = Mathf.Sin(x);
// y = Mathf.Cos(x);
// y = Mathf.Tan(x);
// y = k / x;
// 生成【cube】并且设置它们的位置
GameObject obj = Instantiate(spherePrefab, transform.position, Quaternion.identity);
obj.transform.position = new Vector3(x, y, 0);
// 把生成的【cube】存储到动态数组中,并用一个变量记录最后一个【cube】的下标
list.Add(obj);
destroyIndex = list.Count - 1;
}
if (Input.GetKey(KeyCode.D))
{
// 防止数组下标越界
if (destroyIndex >= 0)
{
// 从动态数组中拿到要销毁的【cube】
GameObject obj = (GameObject)list[destroyIndex];
// 把删除的【cube】的坐标值赋值给 x 和 y
// 当按下 A键 的时候,会继续沿着删除的【cube】的位置画下去
// x 位置后面减去【0.1f】是因为把最后删除的【cube】的 x坐标值 赋值给生成的【cube】时
// 第 46 行代码在计算的时候会加上0.1f,就是在最后删除的【cube】的x位置上加0.1f
// 最后得到的就不是最后删除的【cube】的x坐标
x = obj.transform.position.x - 0.1f;
// 销毁【cube】
Destroy(obj);
// 从动态数组中移除【cube】对象,令数组的长度减一
list.RemoveAt(destroyIndex--);
}
}
}
}
用【Unity】中的【3D Object】画【数学函数】图形 —— 正弦函数... { }的更多相关文章
- Python 绘制你想要的数学函数图形
Python 非常热门,但除非工作需要没有刻意去了解更多,直到有个函数图要绘制,想起了它.结果发现,完全用不着明白什么是编程,就可以使用它完成很多数学函数图的绘制. 通过以下两个步骤,就可以进行数学函 ...
- 关于Unity中的3D拾取
3D拾取 3D游戏实际上看到的是2D画面,我们在屏幕上点击,想要找到哪个3D物体,我们实际上是在一个2维平面内做3D拾取. 3D拾取实际上是,当玩家点击屏幕的时候,会从显示屏幕的摄像头发射一条射线,射 ...
- 使用代码给Unity中的动画片段绑定回调函数
在制作动作游戏的时候,需要播放许多动画,同时还有个需求,那就是动画播放到一定时间时,给一个回调函数,好做对应的状态变更, 我查了一下,发现如果使用的是unity自带的动画系统,要做到这样的话,需要这样 ...
- Tip8:Unity中诸如 Awake() Start() Update()等函数的 执行顺序
Unity脚本中有很多的事件函数,下面是各种函数的执行顺序: 1.reset(); 2.Awake(); 3.OnEnable; 4.OnLevelWasLoaded(); 5.Start(); 6. ...
- 小小知识点(三十五)MATLAB中如何更改所画Figure的图形比例
1. 打开一个figure,show plot tools and dock figure 2.选择图形的 more properties 3. 选择aspect ratio中的plotboxaspe ...
- unity中三种调用其他脚本函数的方法
第一种,被调用脚本函数为static类型,调用时直接用 脚本名.函数名()第二种,GameObject.Find("脚本所在的物体的名字").SendMessage(" ...
- 浅谈unity中gamma空间和线性空间
转载请标明出处:http://www.cnblogs.com/zblade/ 一.概述 很久没有写文章了,今天写一篇对gamma空间和线性空间的个人理解总结,在查阅和学习了各个资料后,算是一个个人笔记 ...
- 游戏的物理和数学:Unity中的弹道和移动目标提前量计算
下载地址:https://www.jianguoyun.com/p/DZPN6ocQ2siRBhihnx8 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺 ...
- 3D语音天气球(源码分享)——在Unity中使用Android语音服务
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...
- Unity UGUI和特效(含粒子系统和3D Object)之间层级问题
撰写本文时使用Unity的版本为2017.4.10f1(64bit) 1.描述问题 需求:通过UGUI制作一个界面之后,我需要在界面的后面跟前面各添加一个特效. 问题:同一层级UI是最后渲染的,所以U ...
随机推荐
- 交警也觉得妙——Python 识别车牌
车牌识别在高速公路中有着广泛的应用,比如我们常见的电子收费(ETC)系统和交通违章车辆的检测,除此之外像小区或地下 车库门禁也会用到,基本上凡是需要对车辆进行身份检测的地方都会用到. 一些背景: 车牌 ...
- Linux编辑shell脚本快速启动jar包
1.上传jar包到服务器 2.创建并编辑start.sh文件 vi start.sh 将下面内容复制到文件中 ps -ef|grep xf-demo |grep -v grep |awk '{prin ...
- netty系列之:kequeue传输协议详解
目录 简介 KQueueEventLoopGroup KQueueEventLoop KQueueServerSocketChannel和KQueueSocketChannel 总结 简介 在前面的章 ...
- Spring学习笔记(4)Spring 事件原理及其应用
在 JDK 中已经提供相应的自定义事件发布功能的基础类: java.util.EventObject类 :自定义事件类型 java.util.EventListener接口:事件的监听器 首先了解几个 ...
- Linux为所有用户安装Miniconda
如果以root身份默认安装,后续普通用户再安装的话,是直接用不起来的,需要改些东西,所以在安装时最好全局安装,所有用户都可用 执行安装脚本:sudo bash Miniconda3-latest-Li ...
- 阿里 Maven仓库
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...
- HelloWorld入门程序
程序开发步骤说明 开发环境搭建完成后我们就可以开发第一个java程序了 java程序开发三步骤:编写.编译.运行 编写Java源程序 1.在本地盘目录下新建文本文件,完整的文件名修改为HelloWor ...
- 照着这个保姆级文档来,虚拟机装CentOS不再踩坑
软件准备 VirtualBox 6.1.26 centOS镜像 接下来我们就开始进行安装: 创建虚拟机 新建虚拟机 点击下一步,调整内存大小 内存大小根据需要调整,然后点击下一步 3. 虚拟硬盘设置 ...
- 并发编程原理学习-reentrantlock源码分析
ReentrantLock基本概念 ReentrantLock是一个可重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁,并且在获取锁时支持选择公平模式或者非公平模式 ...
- s905l3a系列刷armbian 教你从0搭建自己的博客
最近服务器又更换了,原来的有一点点小意外(一个电阻给我焊接时搞掉了). 哎~~今天,我淘到了一个好东西----CM311-3a,配置很诱人,价格也不贵,60绰绰有余 比较 CM311-3a N1(炒到 ...