您现在的位置是:主页 > news > n加1网站建设/网络营销课程设计
n加1网站建设/网络营销课程设计
admin2025/5/31 20:22:20【news】
简介n加1网站建设,网络营销课程设计,页面设计脚怎么设计,中国企业商铺网Unity3D Hello world 建工程 (unity2018.3.7f1) 创建项目图标形似一片纸上写了一个"",右边写着"new"。 然后选好项目的路径和起好名字就可以点Create project了。 图片上没有名字是因为截图之后我用了橡皮擦。 然后项目就建好了,…
Unity3D Hello world
建工程
(unity2018.3.7f1)
创建项目图标形似一片纸上写了一个"+",右边写着"new"。
然后选好项目的路径和起好名字就可以点Create project了。
图片上没有名字是因为截图之后我用了橡皮擦。
然后项目就建好了,可以看到新建的项目里有一个叫Scenes的文件夹,它的里边还有一个SampleScene的场景,我们可以右键这个场景然后让它在资源管理器里显示。
新的场景里面是一大片平地和一片蓝天~
对着平地和蓝天按下鼠标右键并且拖动就可以改变视角,↑↓←→移动,和游戏里是一样的。
对着平地和蓝天按下鼠标中键也可以移动。
调整窗口布局的话拖动我用红色圈住的标签就可以了,随便拖,从菜单栏的"窗口"里可以点出更多窗口。
建物体
菜单栏→3D对象→立方体
就可以创建一个立方体。
同理,还可以创建一个圆球;但是unity不是用来建模的,因此我们增加一些复杂的物体时就需要将3D文件加入unity的工程里。
点击菜单栏下面的工具栏里的按钮,就可以修改物体大小和位置了。这些大小和位置也可以从右侧的检查器框里来调整。
unity里面的"地面"的网格在游戏运行后根本找不到,也不会自己影响任何物体。
建脚本
接下来,点一下球体,或者从 "层级"框 中点一下球体的名字(Sphere)。当然,名字也是可以改的。
检查器的最下方有添加组件按钮,添加组件选择最下面的New script,然后填写脚本的文件名同时也是脚本里的类名,就在磁盘中增加了C#脚本,而且脚本也自动添加给了当前选中的物体。
立方体的位置和旋转的6个值全为0,缩放3个值全为6;圆球缩放全为2,位置Y为4,其他为0。
可以新建一个文件夹来存放脚本文件,有一天项目变大了,文件变多了这样做就很必需。
双击脚本文件就自动打开了编译器,有的人没下载编译器于是就自动打开了记事本…… 不太推荐用记事本编C#。
进入编译器自动赠送十几行代码!🎁
其中,Start()就是unity游戏开始运行时要执行的,Update()就是游戏程序运行中循环执行的,一遍一遍反复执行,在Update()花括号内写一行代码一秒钟重复执行n次。
如果还不认识Unity里的类,就进这里docs.unity3d.com/cn/current/ScriptReference/index.html来看脚本API。
如果不太清楚C#语法或者认为创建一个数组就是float arr[16];
或者就是arr=[]
的话,就进这里docs.microsoft.com/zh-cn/dotnet/csharp/来看C#语法。
当然都要加https:\。
Unity可以自己检查已保存且没语法错误的脚本的字段,这些字段的初值可以在Unity编辑器里调整,如果已经在代码里设置了初值,这些字段的初值仍然可以在Unity编辑器里调整,而且unity编辑器不会修改这些脚本里的代码。
注意是字段。
要想让物体自然地动起来就得给物体添加个物理力,能添加物理力的前提是物体有刚体(Rigidbody)。
要使游戏不穿模,就要给物体添加碰撞器(Collider)。
球体移动脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Move : MonoBehaviour
{/// <summary>/// 实体当前位置。/// </summary>public Vector3 Position => obj.transform.position;/// <summary>/// 立方体中心。/// </summary>public Transform Center => Cube == null ? null : Cube.transform;/// <summary>/// 专用立方体。/// </summary>public GameObject Cube;/// <summary>/// 跟踪专用相机。/// </summary>public Transform Camera;/// <summary>/// 相对路径。/// </summary>public List<Vector3> movePoints;/// <summary>/// 推力。/// </summary>public float energy = 1;/// <summary>/// 相机位置偏移,使相机能够斜对着物体。/// </summary>public Vector3 positionAddend;//这里三元数的任何元的值都不应该大于观察距离public float visualDist;//观察距离public float speed = 1;//球速度private List<Vector3> points;//路径private int moveTo = 0;//当前移动目的路径点的序号private float errRad = 1;//容差,当路径点与物体中心直线距离小于这个值时就开始向下一个路径点移动private Rigidbody obj;//获取刚体void Start(){obj = GetComponent<Rigidbody>();//给obj赋值SetErr(obj);//调用函数根据物体尺寸设置容差points = new List<Vector3>();//新建列表,计算路径点的世界坐标if (Cube != null && movePoints != null && movePoints.Count > 0){Cube.transform.rotation = new Quaternion(0, 0, 0, 0);//归零立方体旋转值float x, y, z, sx, sy, sz;x = Cube.transform.position.x;//立方体x坐标y = Cube.transform.position.y;//立方体y坐标z = Cube.transform.position.z;//立方体z坐标Vector3 cmf = Cube.GetComponent<MeshFilter>().mesh.bounds.size;//获取立方体的尺寸Vector3 cs = Cube.transform.localScale;//获取立方体的缩放sx = cs.x * cmf.x / 2;sy = cs.y * cmf.y / 2;sz = cs.z * cmf.z / 2;string res = "Create: ";//下方向控制台输出信息foreach (Vector3 vector in movePoints){Vector3 tmp = new Vector3(vector.x * sx + x, vector.y * sy + y, vector.z * sz + z);res += "(" + tmp.x + "," + tmp.y + "," + tmp.z + "); ";points.Add(tmp);}Debug.Log(res);}}private void SetErr(Rigidbody obj){Vector3 smf = obj.GetComponent<MeshFilter>().mesh.bounds.size;Vector3 ss = obj.transform.localScale;errRad = Mathf.Max(ss.x * smf.x, ss.y * smf.y, ss.z * smf.z) / 2 * 1.1f;//确保容差值比物体宽度长度和高度的最大值大一点Debug.Log("Err: " + errRad);}void Update()//循环执行{Vector3 p = points[moveTo];//当前的目的路径点float dist = Vector3.Distance(Position, p);//求距离if (dist <= errRad)//若小于容差{obj.velocity /= 5;//转弯时减速至原来的20%moveTo = (moveTo + 1) >= points.Count ? 0 : (moveTo + 1);//移动到下一个路径点,如果没有下一个就到第一个Debug.Log("Now move to point(" + moveTo + "): " + p);}elseObjMove(p);CameraMove();}/// <summary>/// 与其他物体分离。/// </summary>void OnCollisionExit(Collision collision) { Debug.Log("物体离开中心!"); }//物体离开运动表面时就在控制台告警/// <summary>/// 移动物体。/// </summary>/// <param name="tar">目标点</param>private void ObjMove(Vector3 tar){float mag = obj.velocity.magnitude;if (mag != 0) obj.velocity = obj.velocity / mag * speed;//限速Vector3 v = (tar - Position) * energy * Time.deltaTime;//动力指向下一个路径点tarVector3 g = (Center.position - Position) * Time.deltaTime;//重力g让物体与被环绕物体紧密贴合float gm = g.magnitude;float vm = v.magnitude;if (gm > vm) g = g / gm * vm;obj.AddForce(v + g);//给物体加力}/// <summary>/// 相机跟踪。/// </summary>private void CameraMove(){Vector3 aimLoc = Position - Center.position;//注视点位置Camera.position = Vector3.MoveTowards(Camera.position, Center.position + positionAddend + (aimLoc / aimLoc.magnitude * System.Math.Abs(visualDist)), energy * 255 * Time.deltaTime);//起点,终点,模Camera.LookAt(Center);//LookAt方法使矢量的方向指向一个点}
}
实验要求让球在正方体表面上直走(不能飞起来),每越过一条棱,就在立方体面中心转弯一次,第一次左转,相邻两次转弯的左右方向必然不同。也就是说上次左转,那么翻过一条棱后就右转,以此类推,循环运动。而且主摄像机要全程监视圆球运动。
代码如上,unity里设置的数值如图所示:
圆球:
- Move(Script):
- 转换:
- 位置:(0,4,0)
- 旋转:(0,0,0)
- 缩放:(2,2,2)
- Move Points:
- 大小:11
- 元素:
- (0,1,0)
- (1,1,0)
- (1,0,0)
- (1,0,1)
- (0,0,1)
- (0,-1,1)
- (0,-1,0)
- (-1,-1,0)
- (-1,0,0)
- (-1,0,-1)
- (0,0,-1)
- Energy:300
- Position Addend:(4,0,4)
- 立方体:Cube
- 摄像机:Main Camera(Transform)
- Visual Dist:20
- 速度:2
- 转换:
- 球体碰撞器:
- 是触发器:false
- 材质:None
- 中心:(0,0,0)
- 半径:0.5
- 刚体:
- 质量:0.1
- 阻力:1
- 角阻力:1
- 使用重力:false
- 是运动学的:false
- 插值:无
- 碰撞检测:离散的
- Constraints:
- 冻结位置:false,false,false
- 冻结旋转:false,false,false
立方体:
- 转换:
- 位置:(0,0,0)
- 旋转:(0,0,0)
- 缩放:(6,6,6)
- 盒状碰撞器:
- 是触发器:false
- 材质:None
- 中心:(0,0,0)
- 大小:(1,1,1)
- 刚体:
- 质量:1
- 阻力:1
- 角阻力:1
- 使用重力:false
- 是运动学的:true
- 插值:无
- 碰撞检测:离散的
- Constraints:
- 冻结位置:true,true,true
- 冻结旋转:true,true,true
其它的,可以给圆球加上材质以便更直观地看到圆球的运动。
都建完了,走起
脚本和数值都做好后就可以点击执行了,注意是点击Unity编辑器里的执行而不是Visual Studio里的。
执行按钮是一个在Unity编辑器顶部画了一个朝右的三角形的按钮。
动图很大,为了图片小,已经压缩。这是已经添加材质的,材质随便。
,这里边并没有输出Hello World字符串,不过也没有规定说Hello World里就必须输出Hello World字符串呀,Unity里面的输出真正在玩家打游戏的时候根本就是不会看的……