[周更]5.unity3D 三体运动(简易版)
ε≡٩(๑>₃<)۶ 一心向学
文章目录
- [周更]5.unity3D 三体运动(简易版)
- 前言
- 组件Rigidbody改变速度介绍
- 一、场景搭建
- 1.球(简易版,就它一个)
- 1.小球一号
- 2.小球二号
- 3.小球三号
- 二、脚本设计
- 1. 添加刚体组件
- 2. 小球脚本设计
- 结束语
前言
没有什么能比自己做个小项目更有成就感的事了。大家学到了些东西后就应该多多尝试,这样才能彻底学透。要不然可能过几周就忘了。惨痛教训:三个月前学的matlab,今天打开来,发下完全不会了(呜呜呜😂)
今天就简单介绍一下unity引擎中的刚体组件,用来做物理碰撞和运动的这些都非常轻松。
这是用刚体组件粗略做出来的三体运动的简单效果图。
组件Rigidbody改变速度介绍
直接改变速度:
rigidbody.velocity = new Vector3(0,0,0);
//将速度设置为零
通过施加力来改变速度:(一般用来模拟真实物理运动)
rigidbody.AddForce(new Vector3(0,0,0));
//给这个物体一个大小为0的力
一、场景搭建
这里我们介绍相关物体的基础设置,这四个物体的贴图都可以直接在网上找到。
1.球(简易版,就它一个)
三体运动,没球不行。
1.小球一号
2.小球二号
3.小球三号
三个小球的属性都基本不需要改动,就将位置和大小稍作调整即可。
二、脚本设计
1. 添加刚体组件
给小球添加rigidbody刚体,记得把重力取消,不然小球会持续下落。
点击Add Component
输入rigid就应该可以看到这个组件了。
记得取消重力!
(把Use Gravity的勾去掉)
2. 小球脚本设计
主要是给小球添加朝向其他小球的力。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move_weight : MonoBehaviour
{
// Start is called before the first frame update
//模拟质量
public float w;
//用list来储存其他小球的质量
private List<float> wList = new List<float>();
//用list来储存其他小球与该小球之间的距离向量
private List<Vector3> vList = new List<Vector3>();
//大约为小球的运动速度大小,越大则小球加速越快
private float speed = 1f;
//组件刚体
private Rigidbody rigidbody;
// private int []arr = {-1,1};
void Start() {
//获得小球刚体
rigidbody = GetComponent<Rigidbody>();
//一开始小球需要一个扰动速度,否则三个小球会之间汇聚在它们三个质心的位置
//不会有相互围绕旋转的效果
rigidbody.velocity = (transform.position.normalized+ new Vector3(Random.value, Random.value, Random.value));
}
// Update is called once per frame
void Update()
{
//获得该标签下的所有游戏物体
var guids = GameObject.FindGameObjectsWithTag("1");
//guids是个游戏物体数组
foreach (var guid in guids)
{
if(guid==this.gameObject)
{
continue;
//不要把自己这个小球算进去
//算进去当然也没什么关系
}
wList.Add(guid.GetComponent<move_weight>().w);
//加到数组里
vList.Add(guid.GetComponent<Transform>().position-this.transform.position);
}
for (int i = 0; i < wList.Count; i++)
{
//直接给本小球增加一个面向其他小球的力
rigidbody.AddForce(vList[i]*speed*wList[i]);
// v -= (consttemp * wList[i])*(vList[i]-transform.position)/(0.0001f+Mathf.Pow(Vector3.Distance(transform.position,vList[i]),3.0f));
}
//清空数组
wList.Clear();
vList.Clear();
}
}
结束语
快要期中考了,SOS!学习任务也变多了,接下来有可能都不能整些更有难度的任务。等期中考完再来介绍更复杂的项目吧。
ᕦ(・ㅂ・)ᕤ