Unity3D一些比较基本的脚本及组件(C#)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Unity3D⼀些⽐较基本的脚本及组件(C#)通过代码创造图形
//创建顶点,创建序列,创建⽹格,然后把⽹格赋给⽹格序列器
//draw a triangle
void Start () {
Vector3[] vs = new Vector3[3];
vs[0] = new Vector3(0,0,0);
vs[1] = new Vector3(1,0,0);
vs[2] = new Vector3(0,1,0);
int[ts] = new int[3];
ts[0] = 0;
ts[1] = 1;
ts[2] = 2; //要注意顺序,要⽤左⼿系,法线向外,拇指向外
Mesh mesh = new Mesh();
GetComponet<MeshFilter>().mesh = mesh;
mesh.vertices = vs; // vertices⾄⾼点
mesh.triangles = ts;
}
///* *///
//draw a triangle程序封装代码
public GameObject Create Triangle()
{
GameObject obj = new GameObject(“Triangle”);
MeshFilter mf = obj.AddComponet<MeshFilter>();
obj.AddComponent<MeshRender>();
Mesh mesh = new Mesh();
mesh.vertices = nes[]
{
new Vector3(0,0,0);
new Vector3(3,0,0);
new Vector3(0,3,0);
};
mesh.triangles = new[]
{
0,2,1//不⽤分号,初始化系,直接把初始值放进去
};
mf.mesh = mesh;
return obj;
}
Camera 的性质与使⽤
public CameraClearFlags clearFlags; //clearFlags是相机清除表识
public ColorbackgroundColor; //给定他的颜⾊,背景⾊,只有单⾊才起作⽤
public int cullingMask; //提出掩码
public class chapter6 : MonoBehaviour
{
public GameObject cube;
void Start(){
ber = 9; //把cube设置在第9层
Camera cam = this.GetComponet<Camera>()’
cam.clearFlags = CameraClearFlags.SolidColor;
cam.backgroundColor = new Vector3(1,0,0,0); //表⽰设置颜⾊
cam.cullingMask = 9; //表⽰第9层的都不会被渲染出来,也就是说cube不会显⽰出来
}
}
//CameraClearFlags是⼀个枚举类型,有以下四个成员:
solidColor 表⽰⽤backgroundColor所制定的填充背景
skybox 表⽰天空盒,模拟天空效果填充
Depth 只是清除深度缓存,保留上⼀帧所使⽤的颜⾊
Nothing 不进⾏背景清除,这种情况在游戏和模拟应⽤中⽐较少⽤
public bool orthographic;//⽤于读取和设定相机的投影⽅式,如果为true则表⽰是正交投影,否则为透视投影;正交投影可⽤于UI和2D开发
public float orthographicSize; //⽤以指定正交投影的视景体的垂直⽅向尺⼨的⼀半
public Rect rect; //相机对应的视⾓⼝的位置和⼤⼩,rect以单位化形式制定相机视⼝在屏幕中的位置和⼤⼩,位置⼤⼩取值范围为0~1,满屏为1
Camera main = this.gameObject.GetComponet<Camera>();
this.gameObject.SetActive(false);
Camera cam0 = camGO0.AddComponet<Camera>();
cam0.orthographic = true;
cam0.transform.position = main.transform.position;
cam0.transform.rotation = main.transform. rotation;
cam0.orthographicSize = 2.0f; //指物体渲染后显⽰的⼤⼩远近,数值越⼤,相机视⼝越靠近该物体,从⽽该物体显⽰出来的更加⼤
cam0.rect = new Rect(0f,0f, 0.5f, 0.5f); //前两个参数是camera的位置,后⾯两个参数设置相机⼤⼩(0.5f,0.5f)表⽰占x轴的⼆分之⼀,y轴的⼆分之⼀,所以总共占渲染窗⼝的四分之⼀
Camera cam1 = camGO1.AddComponet<Camera>();
cam1.orthographic = true;
cam1.transform.position = main.transform.position;
cam1.transform.rotation = main.transform. rotation;
cam1.orthographicSize = 7.0f;
cam1.rect = new Rect(0.5f, 0.5f, 0.5f, 0.5f);
}
Material,Shader,Texture(材质,着⾊器,纹理)
光照、纹理等让物体更加的真实。
材质在⼏何物质的基础下增加额外的东西,让物体显得更加真实。
着⾊器:核⼼最后的渲染过程。
特殊的⼀串代码,⽤特殊语⾔所写,实现⼀定的算法。
计算每个像素点的颜⾊。
根据定点信息,光照,材质,计算顶点颜⾊,最后显⽰出来。
Unity提供多种着⾊器提供选择。
有专门⼀本书提供着⾊器的介绍。
主流⼯具语⾔是Cg(C语⾔+graph)
纹理:图⽚,增加在物体表⾯,复制在材质上,材质再复制给物体。
美⼯的过程。
程序开发⼈员主要处理的是材质。
Rendering Mode,渲染模式,进⼀步确定着⾊器类型,在Standard系列下,有四种类型:Opaque(不透明), Cutout(表⽰在透明和不透明区域之间具有尖锐边沿,没有不透明
效果,⽐如说⼀些镂空边缘或者⼀些草的材质), Fade(渐变,⽤以表⽰材质的透明度逐渐改变), Transparent(处理透明的,⽐如说玻璃材质)
Albedo,反照率,表⽰⼀种材质对⽩光的反射能⼒,是材质的散射、反射、折射和半透明成分的总和,相关参数控制物体表⾯的基⾊,纯⿊⾊「RGB=(0,0,0),Albedo=0」;⽩
⾊「RGB=(1,1,1), Albedo=1」。
alpha通道控制材质透明度,alpha值越⼩,Albedo的实现效果越微弱(因为alpha越透明度越⾼,当透明度极⾼的时候甚⾄不可以看到表⾯效
果,所以有材质没材质,有调Albedo和没调也⼀样)。
Metallic,表⽰材质处于⾦属模拟⼯作流metalness workflow下。
⾦属模拟⼯作流与镜⾯反射⼯作流specular workflow是两种处理光反射的不同模式。
光照于CG中⼗分重要。
PBR(physical base render)基于物理渲染,可以模拟光线于现实的情况,实现光线追踪。
Smoothness,光滑度,最光滑相当于镜⾯反射。
MeshFilter&MeshRender
⽹格渲染器
Cast shadows,⼀个开关,该⽹格物体是否产⽣阴影
Receive Shadows,⼀个开关,是否接受其他物体投射到其上⾯
Motion Vectors,运动适量,⽤于追踪⼀个物体从⼀帧到下⼀帧的空间位置,并可⽤于后期处理效果,⽐如说运动模糊处理和时域抗锯齿效果。
Coding for materials
Shader shader; Texture texture; Color color;
void Start(){
Renderer rend = GetComponet<Renderer>();
rend.material = new Material(shader); //把着⾊器、材质、颜⾊复制给该物体
rend.material.mainTexture = texture;
rend.material .color = color;
}
Using colors
public class Example: MonoBehaviour{
Color colorStart = Color.red;
Color colorEnd= Color.green; //颜⾊差值算法
float duration = 1.0f;
Renderer rend;
void Start(){
rend = GetComponent<Renderer>()
}
void Update(){
float lerp = Mathf.PingPong(Time.time, duration)/duration); //如果⼤于该值则截断,返回上⼀个值, 然后开始往回缩⼩值,类似打乒乓球⼀样 //该参数为,从0到1,在从1到0,如果是0则为纯粹的红⾊,如果为1则为纯粹的绿⾊,动态的改变,包括颜rend.material.color = Color.Lerp(colorStart, coloredEnd, lerp); //lerp只能是在0~1之间,所以上⾯⼀定要除以duration
}
}
纹理⼤⼩要满⾜2的n次⽅(2、4、8、… 、1024、2048)等, Unity允许倒⼊的最⼤纹理为8k
Operating textures with codes
public class ExampleClass:MonoBehaviour{
public Texture[]texture;
public float changeInteval = 0.33F;
public Renderer rend;
void Start( rend = GetComponet<Renderer>;)
void Update(){
if (textures.Length == 0)return;
int index = Methf.FloorTolnt(Time.time/changelntervla);
index = index % textures.Length;
rend.material.mainTexture = textures[index];
}
}
物理组件(刚体组建)
Rigidbody:
Is Kinematic,勾选上物体运动将不会受物理引擎没有关系,只纯粹受transform影响,但是会受其他影响;虽然缸体⾃⾝不受⼒和碰撞的影响,但会通过⼒的碰撞传导给别的物
体;
Interpolate,差值;
Collosion Detection, ⽤于检测与其他刚体的碰撞,其主要⽬的之⼀是防⽌物体之间的穿越 [默认为Discrete,表⽰每⼀帧做⼀次检查,缺点是快速移动游戏对象会有穿透现象];Constraints,刚体约束,可以冻结游戏对象在某个⽅向限制的移动和旋转。
eg.,如果选择了Freeze Position中的X,表⽰冻结游戏对象在X轴上的运动;如果选择Free Rotation下
的X,表⽰冻结游戏对象在X轴上的旋转。
[ 使⽤价值,⽐如说挂钩有时候只会在⼀个⽅向上乱动,所以冻结其他⽅向的数值,从⽽不让该物体受到⼒的影响后在其他⽅向上乱
晃 ];
通过控制⾯板,Rigibody类的使⽤⽅法:
public class fvc_rigibody_falling: MonoBehaviour{
private Rigibody rg; //通过代码实现⾃由落体
void Start(){
rb = this. gameObject.AddComponent<Rigibody>();
rb.isKinematic = false; //受物理引擎影响,isKinematic不开启
rb.detectCollisions = ture;
eGravity = true;
rb.mass = 0.1f;
}
void Update(){
rb.drag = Mathf.Repeat(Time.time*15f, 8.0f);
}
}
//模拟⼀个球平抛运动
public class fvc_rigibody_falling: MonoBehaviour{
private Rigibody rg; //通过代码实现⾃由落体
///*
[Range(0,20)]
public int speed = 5;
public GameObject humanbeing;
*///
privare Vector3 old_pos;
void Start(){
rb = this. gameObject.AddComponent<Rigibody>();
rb.isKinematic = false; //受物理引擎影响,isKinematic不开启
eGravity = true;
rb.mass = 0.1f;
rb.velocity = 5.0f* Vector3.right; //给物体增加⼀个速度
old_pos = transform.position;
//humanbeing.transform.Translate(0,0,speed*Time.deltaTime,Space.World);
}
void FixedUpdate(){ //把抛物线画出来
Debug.DrawLine(old_pos, transform.position, Color.red, 60,false); //把抛物线画出来
old_pos = transform.position;
}
void Update(){
rb.drag = Mathf.Repeat(Time.time*15f, 8.0f);
}
}
angularVelocity表⽰⾓速度
centerOfMass表⽰刚体质⼼
//让刚体旋转
public class fvc_rigibody_falling: MonoBehaviour{
private Rigibody rg; //通过代码实现⾃由落体
void Start(){
rb = this. gameObject.AddComponent<Rigibody>();
rb.angularVelcity = new Vector3(0,2.4f,0); //通过物理引擎来模拟旋转效果,底层驱动是物理引擎
rb.detectCollisions = false;
re.angularDrag = 0.01f;
}
void Update(){
if(Input. GetKeyDown(KeyCode.Space)){
rb.freezeRotation = true;
}
if(Input. GetKeyDown(KeyCode.Z)){
rb.centerOfMass = new Vector3(-0.5f,0,0);
}
if(Input. GetKeyDown(KeyCode.X)){
rb.centerOfMass = new Vector3(0,0,0);
}
}
}
force表⽰⼒的⽮量,该⽮量长度表⽰⼒的⼤⼩,参数mode表⽰模式
public void AddForce(Vector3 force, ForceMode mode = ForceMode.Force); //给物体加⼒效果,第⼀个force表⽰给刚体的加速度,该⼒是在世界坐标下,eg,.橙⾊坐标public void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode = FforceMode.Force);//围着质⼼的轴旋转,和上⾯的⼀样,不过多了个position参数public void AddRelativeForce(Vector 3 force, ForceMode.mode = ForceMode.Force );//加相对⼒,相对于⼒的局部坐标下,eg,.绿⾊坐标
Impulse, 表⽰冲量,根据物理当中的动量定理更适⽤于模拟⼒作⽤的瞬间效果,⽐如冲击⼒和爆炸效果
VelocityChange, 函数的第⼀个参数force表⽰游戏对象的速度改变了,此时游戏对象的、础运动速度,与其质量⽆关//添加⼀个⼒
public class fvc_rigibody_force: MonoBehaviour{
private Rigibody rg; //通过代码实现⾃由落体
void Start(){
rb = this. gameObject.AddComponent<Rigibody>();
rb.mass = 0.5f;
eGracity = false;
rb.AddForce(new Vector3(4,0,0), ForceMode.Force);
print(fvx_tools.to_string(rb.velocity));
}
void Update(){
print( fvc_tools.to_string(rb.velocity));
}
//void FixedUpdate专门⽤于物理引擎中的模拟,越跑越快
}
}
//给物体增加速度
public class fvc_rigibody_force: MonoBehaviour {
private Rigibody rb;
void Start(){
this.transform.Rotate(0,0,-20);
rb = this.gameObject.AddComponent<rigibody>();
eGravity = false;
rb.AddRelativeForce(new Vector3(0,1,0) ForceMode.velocitychange);
}
}
public Vector3 inertiaTensor:
inertiaTensor表⽰刚体的惯性藏粮,惯性越⼤,⼒相同,旋转的越困难
//例⼦
public class fvc_rigibody_inertia: MonoBehaviour{
Rigibody rb;
void start(){
rb = this.gameObject.AddComponent<Rigibody>()’
rb.inertiaTensor = new Vector(0.05f, 0.05f, 0.05f);
rb.mass = 0.5f;
rb.angularDrag = 0.0f;
eGravity = false;
rb.AddForceAtPosition(new Vector3(0.0f, 0.0f, 6.0f), transform.position + new Vector3(0.5f,0,0));
}
}
//例⼦
public void AddTorque(Vector3 torque, ForceMode mode = ForceMode.Force);//加个⼒矩,全局坐标下,让他旋转
public void AddTorque(float x , float y , float z, ,ForceMode mode = ForceMode.Force)//局部坐标下加⼒矩
//例⼦
public Vector3 position; //如果通过position改变刚体的位置,游戏对象的transform会在下⼀个物理模拟时刻被更新,通过这种⽅式改变游戏对象的位置⽐直接使⽤Transform的position要快,因为后者要重新计算游戏对象中的碰撞器(Collider)位置,同理,通过Rigidbody的rotation改变刚体的姿态进⽽可以更新游戏对象的Transform,同时,也⽐直接通过改变Transform的rotation要快
public Quaternion rotation;
//例⼦
public void MovePosition(Vector3 position);
public void MoveRotation(Quaternion rot); //通过函数调⽤可以⽤差值计算,如果不想⽤差值计算,两者是⼀样的,但如果要⽤到,这个和上⾯的函数两者之间有差别
只有当isKinematic设置为false,施加⼒矩,碰撞相关的函数才可以起作⽤
碰撞器
给物体施加碰撞器来检验碰撞效果。
Unity中,2D和3D分为了两部份,本课主要讲3D碰撞器。
场景复杂的时候计算量会很⼤。
简单碰撞器
指盒⼦碰撞器(Box Collider),球形碰撞器和胶囊碰撞器。
bounds类描述⼀个轴对齐的泪,主要⽤于游戏对象的碰撞检测中,其构造函数为:public Bounds(Vector3……)
把最⼩点和最⼤点定下来,就可以把碰撞器定下来。
is Trigger,该碰撞器是否⽤作触发器,勾选时成为触发器,触发器是碰撞器的组成部分,当碰撞器⽤做触发器时,会触发事件,但不受物理引擎控制,与其他对象进⾏碰撞,⽽是会发⽣穿透。
不需要避规。
//盒⼦碰撞器代码
public class fvc_box_collider:MonoBehaviour{
void Stare(){
BoxCollider bc = this.gameObject.GetComponent<BoxCollider>();
print(bc.center);
print(bc.bounds.center);
}
物理材质
⽤来模拟物体接触⾯的摩擦和弹性属性。
Assets⾯板点击右键/creat/Physic Material
dynamic Fiction 动摩擦系数(0~1)
static Fiction 静摩擦系数
Bounciness 弹性(0~1)
Friction Combine表⽰两个碰撞的物体间摩擦的组合(或互相影响)⽅式
Bounce Combine表⽰两个物体碰撞组合的⽅式
(可以⽤⾯板来使⽤该组件,同时也可以⾃⼰写代码来编写)
//模拟两个球体碰撞,给sphere1赋予速度,sphere2静⽌并接受碰撞
public class crash: MonoBehaviour{
public GameObject sphere1; //定义游戏对象的类,⼀个叫做sphere2,⼀个叫做sphere2
public GameObject sphere2;
void Start(){
//对摄像机的定义
Camera cam = Camera.main; //创建⼀个摄像机
Vector3 pos = (sphere2.transform.position-shere1. transform.position)*0.5f+ shere1. transform.position; //计算sphere1的运动位置距离cam.transform.position = pos+new Vector3(0,12,0); //把计算后的距离移动值赋给摄像机的定位值
cam.transform.LookAt(pos, Vector3.forward); //摄像机的看的⽅向
Vector3 dir = (sphere2.transform.position – shere1.transform.position).normalized;
//给sphere1定义刚体组件数据
Rigidbody rb1 = shpere1.AddComponet<Rigidbody>(); //给sphere1赋予刚体组件
eGravity = false; //使⽤重⼒
rb1.mass = 1.0f; //定义质量
rb1.velocity = dir*3.0f; //定义速度
//给sphere2定义刚体组件数据
Rigidbody rb2 = shere2.AddComponent<Rigidbody>(); //给sphere2赋予刚体组件
eGravity = false;
rb2.mass = 1.0f;
//给sphere1定义物理材质数据
PhysicMaterial pm1 = new PhysicMaterial(); //定义⼀个物理材质的类,然后给他开辟新的空间存放
pm1.bounciness = 1.0f; //给sphere1定义摩擦
sphere1.GetComponent<SphereCollider>().material = pm1; //给sphere1定义已经创建的物理材质pm1,并且给该球体添加球形碰撞器
//给sphere2定义物理材质数据
PhysicMaterial pm2 = new PhysicMaterial();
pm2.bounciness = 1.0f;
sphere2.GetComponent<SphereCollider>().material = pm2;
}
//更新数据并打印在测试板块处
void Update(){
print(sphere1.GetComponent<Rigidbody>().Velocity);
print(sphere2.GetComponent<Rigidbody>().Velocity);
}
}。