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

本文介绍如何使用Unity3D引擎中的刚体组件实现简单的三体运动效果。通过给小球添加刚体组件,并设计脚本来模拟各小球间的引力作用,实现了基本的物理碰撞和环绕运动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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



前言

没有什么能比自己做个小项目更有成就感的事了。大家学到了些东西后就应该多多尝试,这样才能彻底学透。要不然可能过几周就忘了。惨痛教训:三个月前学的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!学习任务也变多了,接下来有可能都不能整些更有难度的任务。等期中考完再来介绍更复杂的项目吧。
ᕦ(・ㅂ・)ᕤ(任何不足之处,欢迎大家留言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值