[周更]5.unity3D 三体运动(简易版)

ε≡٩(๑>₃<)۶ 一心向学




文章目录

  • [周更]5.unity3D 三体运动(简易版)
  • 前言
  • 组件Rigidbody改变速度介绍
  • 一、场景搭建
  • 1.球(简易版,就它一个)
  • 1.小球一号
  • 2.小球二号
  • 3.小球三号
  • 二、脚本设计
  • 1. 添加刚体组件
  • 2. 小球脚本设计
  • 结束语



前言

没有什么能比自己做个小项目更有成就感的事了。大家学到了些东西后就应该多多尝试,这样才能彻底学透。要不然可能过几周就忘了。惨痛教训:三个月前学的matlab,今天打开来,发下完全不会了(呜呜呜😂)

今天就简单介绍一下unity引擎中的刚体组件,用来做物理碰撞和运动的这些都非常轻松。

这是用刚体组件粗略做出来的三体运动的简单效果图。

三体运动Python代码 三体的运动_unity


组件Rigidbody改变速度介绍

直接改变速度:

rigidbody.velocity = new Vector3(0,0,0);
//将速度设置为零

通过施加力来改变速度:(一般用来模拟真实物理运动)

rigidbody.AddForce(new Vector3(0,0,0));
//给这个物体一个大小为0的力

一、场景搭建

这里我们介绍相关物体的基础设置,这四个物体的贴图都可以直接在网上找到。

1.球(简易版,就它一个)

三体运动,没球不行。

1.小球一号

三体运动Python代码 三体的运动_游戏程序_02

2.小球二号

三体运动Python代码 三体的运动_游戏程序_03

3.小球三号

三体运动Python代码 三体的运动_c#_04

三个小球的属性都基本不需要改动,就将位置和大小稍作调整即可。

二、脚本设计

1. 添加刚体组件

给小球添加rigidbody刚体,记得把重力取消,不然小球会持续下落。

点击Add Component

三体运动Python代码 三体的运动_List_05

输入rigid就应该可以看到这个组件了。

三体运动Python代码 三体的运动_三体运动Python代码_06


记得取消重力!

(把Use Gravity的勾去掉)

三体运动Python代码 三体的运动_游戏程序_07


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!学习任务也变多了,接下来有可能都不能整些更有难度的任务。等期中考完再来介绍更复杂的项目吧。
ᕦ(・ㅂ・)ᕤ