Unity中行星和恒星的旋转——Rotate和RotateAround
Unity中的旋转——以行星环绕为例
- 实现效果
- 一、与之相关的两种旋转方式
- 1.Rotate
- 2.transform.RotateAround
- 二、行星案例的实现
- Step1:我们先在场景中创建一个球体,并将它放大作为被环绕的恒星(我这里自己上了贴图)
- Step2:制作环绕它的行星;我们创建一个比恒星小一些的球体,将它水平拖拽到离恒星有一定距离的位置
- Step3:再创建一个比行星小的球体,并将其移动到行星的周围
- Step4:卫星的环绕与摧毁
- Step5:脚本的完善(完整的行星脚本)
- Step6:卫星的代码(完整)
- 三、添加多个行星
- step1.CtrlD赋值一个行星,将其名称修改为与第一个行星名称相同
- step2:运行效果
实现效果
一、与之相关的两种旋转方式
1.Rotate
Unity中文文档对于transform.Rotate说明链接:点击进入,用法有很多种,想查看全部用法可以进入链接。
描述:使用 Transform.Rotate 以各种方式旋转 GameObjects。通常以欧拉角而不是四元数提供旋转。
自转用法:
//public来定义可以在外部修改,Unity会以外部编辑器的参数作为游戏运行时的参数public float rotate_speed = 30f;//设置旋转速度void Update(){transform.Rotate(Vector3.down * rotate_speed * Time.deltaTime); //物体自转//Vector3=Vector(0,1,0)是一个向上的向量,代表Y轴//Time.deltaTime每帧调用一次}
我们可以利用这个代码来实现物体的自转,通过
2.transform.RotateAround
Unity中文文档相关说明:
不难理解,RotateAround是专门为物体围绕物体旋转而生的函数,内置参数分别为旋转目标的坐标、旋转的轴向、旋转的速度。
二、行星案例的实现
Step1:我们先在场景中创建一个球体,并将它放大作为被环绕的恒星(我这里自己上了贴图)
为其添加脚本,并将脚本拖拽至创建的球体上:
//public来定义可以在外部修改,Unity会以外部编辑器的参数作为游戏运行时的参数public float rotate_speed = 30f;//设置旋转速度void Update(){transform.Rotate(Vector3.down * rotate_speed * Time.deltaTime); //物体自转//Vector3=Vector(0,1,0)是一个向上的向量,代表Y轴//Time.deltaTime每帧调用一次}
运行游戏可以发现自转效果已经完成:
Step2:制作环绕它的行星;我们创建一个比恒星小一些的球体,将它水平拖拽到离恒星有一定距离的位置
为其添加脚本,并将脚本拖拽至创建的球体上:
public float rotate_speed = 60f; //自转速度public float around_speed = 60f; //公转环绕速度public Transform around_aim; //设置公转目标void Start(){}void Update(){//行星自转 transform.Rotate(Vector3.down * rotate_speed * Time.deltaTime);//行星公转transform.RotateAround(around_aim.position, Vector3.up ,around_speed * Time.deltaTime);}
代码编写完成后将公转目标拖拽至脚本中:(我这里是最终脚本)
点击运行游戏我们可以发现恒星自转,卫星自转加公转,并且我们可以修改脚本参数来修改旋转的速度:
Step3:再创建一个比行星小的球体,并将其移动到行星的周围
在Assets下创建一个文件,并将其命名为:Resources,一定要命名为Resources,大小写都不能错,因为我们等会要从Resources中加载预制体;再在Resources下创建一个文件夹命名为Prefab,大小写也不能错,将创建出来的卫星拖拽至文件夹中,这时我们发现上面的面板中卫星边蓝了,这就说明预制体制作成功,再把场景中预制体删掉,这并不影响我们对于删掉预制体的使用,我们可以在Prefab文件夹下再将其拖拽出来。
Step4:卫星的环绕与摧毁
思路:在行星的周围生成一个卫星并使其成为行星的子物体随着行星一起移动,在生成卫星的一段时间后将其摧毁,再过一段时间再生成
step1:卫星的生成:(这里的pfb、prefabInstance是GameObject类型的全局变量,如果是局部变量不方便后面的摧毁),关键代码如下
pfb = Resources.Load("Prefab/satellite") as GameObject;//加载在Resource文件夹下Prefab文件夹下的statellite预制体 这里要求预制体的名称和代码中的命名一样 最好英文//这也是为什么要固定命名的原因prefabInstance = Instantiate(pfb,this.transform.position + vec ,Quaternion.identity);//生成一个预制体,预制体为pfb,生成的位置是这个脚本挂载的物体的位置(行星位置)+向X轴偏离的位置,默认角度(无偏转)prefabInstance.transform.parent = this.transform;//将卫星设置为行星的子物体
step2:卫星环绕行星旋转,关键代码如下
prefabInstance.transform.RotateAround(this.transform.position, Vector3.up, around_speed * Time.deltaTime);
step3:卫星旋转后销毁
Destroy(prefabInstance);
Step5:脚本的完善(完整的行星脚本)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Planetaryrotation : MonoBehaviour
{public float around_speed = 60f;//控制环绕速度public float rotate_speed = 60f;//控制自转速度public Transform around_aim; //设置行星环绕目标public float time_1 = 3;//卫星出现间隔public float time_2 = 3;//卫星存留时间public float appear_time = 0; //计时参数bool isappear = true;//判断卫星是否消失private GameObject pfb;//需要加载的预制体private GameObject prefabInstance;//生成预制体的实例化public float distance = 10;//控制行星与卫星的间距Vector3 vec = new Vector3(15, 0, 0);//设置一个三维变量用来做行星与卫星间距离的参数Transform tra;//设置一个转换变量类型的载体,position不能和vect相加int num = 0;//控制卫星数量的参数//start函数只执行一次(游戏开始时)void Start(){Vector3 vec = new Vector3(distance, 0, 0);//distance控制距离tra.position = vec;}//每帧执行一次void Update(){Vector3 vec = new Vector3(distance, 0, 0);//行星自转transform.Rotate(Vector3.down * rotate_speed * Time.deltaTime);//行星公转transform.RotateAround(around_aim.position, Vector3.up ,around_speed * Time.deltaTime);//控制卫星出现的时间appear_time = appear_time + Time.deltaTime; //计时器if (appear_time > time_1)//判断是否生成卫星{isappear = false;if(isappear==false&&num!=1)//判断是否已经生成卫星,没有生成卫星便生成卫星{pfb = Resources.Load("Prefab/satellite") as GameObject;prefabInstance = Instantiate(pfb,transform.position + vec ,Quaternion.identity);prefabInstance.transform.parent = this.transform;isappear = true;num = 1;}if(num==1)//如果生成卫星,则让它围绕行星旋转{prefabInstance.transform.RotateAround(this.transform.position, Vector3.up, around_speed * Time.deltaTime);}if (appear_time>time_1+time_2)//判断是否达到存在的时间,达到后摧毁自己,并且将所有相关数据设置为初始化{appear_time = 0;Destroy(prefabInstance);num = 0;} }}
}
Step6:卫星的代码(完整)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Satelliterotation : MonoBehaviour
{public float around_speed = 60f;private Transform around_aim;public string aim_name;void Start(){GameObject container = GameObject.Find(aim_name);//在场景中找到与aim_name一样名称的物体,将其实例化给container//这里是行星的名称,需要在外部手动输入around_aim.transform.position = container.transform.position;}void Update(){//卫星环绕transform.RotateAround(around_aim.position, Vector3.up, around_speed * Time.deltaTime);}
}
一切准备就绪后运行游戏:
三、添加多个行星
step1.CtrlD赋值一个行星,将其名称修改为与第一个行星名称相同
因为卫星是按名称来找行星的,再将其位置拖拽开来,调整其参数
step2:运行效果
Unity中行星和恒星的旋转——Rotate和RotateAround相关推荐
- Unity中刚体使用--坦克炮塔旋转
当在Unity中导入一个Tank模型后,大部分的Tank模型都会有很多部分组成,比如包含底盘.履带.炮塔.炮等. 首先可以粗略的通过添加多个Box Collider分别给底盘.炮塔等部分,然后将rig ...
- 【Unity编程】Unity中的欧拉旋转
版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自 ...
- Unity中旋转方式的探究与对万向节死锁(Gimbal Lock)的理解
Gimbal Lock Gimbal Lock的原理网上已经有很多资料,详细可以看介绍视频.视频讲到Gimbal Lock的时候提到x,y,z三个坐标轴是有从属关系(hierarchical syst ...
- Unity使用c#开发遇上的问题(六)(3dmax围绕指定中心旋转,unity中动态调用预制体并根据模型旋转指定角度)
文章目录 前言 一.3dmax创建子弹.炮塔及武器库 1.相关模型 2.炮塔模型引入unity,无法绕旋转球旋转,重新调整 1.3dmax中默认炮管的中心点 2.选择层次界面 3.选择编辑工作轴 4. ...
- unity中3dUI或者模型始终面向摄像机,跟随摄像机视角旋转丨视角跟随丨固定视角
视角跟随 本脚本为一个目标跟随 unity中3dUI或者模型始终面向摄像机,跟随摄像机视角旋转 使用方法超级简单,对于一个资深的Ctrl+cv程序极为友好 不多讲解直接上代码 代码模块 public ...
- Unity中的旋转和矩阵操作
Definition for Matrix4x4 is from unity Matrix4x4 matrix = new Matrix4x4(); ...
- Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转
Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转 using System.Collections; using System.Collections.Generic; ...
- Unity中游戏多种武器旋转方式
-- 本人学习多种单机游戏的总结笔记 2D中武器跟随鼠标位置旋转 这个一些2D屏幕游戏或者像捕鱼达人也会有这类实现. 第一种代码实现(略微简单,如果能没出错,建议使用这个,如果转化出错可以参考第二种的 ...
- Unity中Oculus分屏相机和普通相机一键切换
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50462157 作者:car ...
最新文章
- Java数据类型及变量作业_day02、Java变量与数据类型
- 【php】 PHP 支持 9 种原始数据类型
- Sap Byd Soap使用 SSL 客户端证书
- 30年前的热门研究,今获经典论文奖,贝叶斯网络之父旧论文「考古」
- python如何导入matlab数据,python学习-python到matlab数据的传输
- 一名 40 岁“老”程序员的反思~
- linux下用iptables做本机端口转发方法(转载)
- 区块链学堂(4):以太坊基本概念及工具Geth、Browser-solidity、Mist
- vue PC端国际化一站式解决方案
- Qt文档阅读笔记-构造WebSocket服务端
- 由B+树看MySQL索引结构
- 蓝色起源8月25日进行无人飞行,携带实验设备等上天
- javascript 函数2——对象排序
- 小白文件管理器 无法与服务器建立联系,小白文件管理器怎么用
- 地铁7号线路图_成都地铁7号线线路图_运营时间票价站点_查询下载
- 随笔-杂记-将对您的电脑造成伤害。 您应该将它移到废纸篓
- UGeek大咖说 | 精彩回顾:京东商城可观测性体系的落地与实践
- 利用python画钻石_用Python制作钻石ASCII艺术品
- Codeforces Round #801 (Div. 2) D2(思维/dfs)
- 最主流的视频剪辑软件,附安装包
热门文章
- LintCode-买卖股票的最佳时机
- Inno Setup入门(十六)——Inno Setup类参考(2)
- Windows10磁盘图标感叹号,Bitlocker提示等待激活
- 在vue项目中使用Antv-f2的小案例
- C# VLC视频播放器
- 第十章:大鸽同学在哪里?痴月熊学python
- C#命名空间、controller方法
- 个人所得税缴纳税率是多少
- Ubuntu部署OpenStack zed版本neutron报错:Feature ‘linuxbridge‘ is experimental and has to be explicitly enab
- Linux中实现一个简单的进度条