Unity笔记

1、 Unity3D的有点和强大之处

书本第一章。

2、 编辑器的界面及其操作,以及基本功能

 

 

 

最上面是菜单栏

hierarchy 是场景、游戏对象的层次体系。

中央是当前的场景

场景上面的3个按钮是控制播放停止

左边是inspector,显示选中的游戏对象的各种具体信息,并提供编辑功能

下面project是项目结构和文件

console是控制台,显示Debug.Log的输出以及一些异常和警告等。

在场景中,按住alt键并拖动点击左击拖动鼠标可以旋转场景的视点。

 

3、 如何创建游戏对象?如何给游戏对象添加组件和脚本代码?

创建游戏对象的三种方法

1、 在编辑器中创建一个游戏对象:顶部|GameObject|选择相应的游戏对象。或者选择相应的场景或者游戏对象,右击|GameOjbect|选择游戏对象,此时是添加子游戏对象。

2、 通过导入外部3D图形或者2D图像生成游戏对象:把assets中的文件拖到场景中

3、 在脚本代码中创建游戏对象:

GameOjbect g = GameOjbect.CreatePrimitive(PrimitiveType type);

创建后默认放在(0,0,0)位置

具体参数看书本19页记录。

 

在编辑器中添加组件

1、 选中游戏对象,点击顶部菜单栏的Component|选择相应的控。,

2、 选择游戏对象,在右边的inspector最底下的Add Component按键,点击,然后选择相应的控件。

3、 在脚本中添加控件。

 

获取添加到游戏对象上的组件

ComponentType c = GetCompoent<Component>()

 

为游戏对象添加组件

GameObject.AddComponent<Component>();

 

每一个脚本文件都必须是一个类,并且继承自MonoBehaviour类,重写Start和Update方法。如下所示。

 

public class LookAtTest : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }

 

//other callback method
}

 

可以通过直接在编辑器界面拖动cs脚本到相应的游戏对象上为其添加脚本。也可以通过AddComponent方法,在脚本中为其添加另一个脚本,把需要添加的脚本看成一个组件即可。

4、 Transform组件的功能,基本用法,如何控制物体平移、旋转等操作?

四元数 Quaternion 与欧拉角,都可以描述旋转。

四元数的构造Quaternion q = Quaternion.AngleAxis(float angle, Vector3 axis)

表示在某个轴上旋转一定角度。(静态方法)

 

q.SetFromToRotation(Vector3 from, Vector3 to)(非静态方法)

生成一个从from旋转到to 的四元数

 

四元数只是一个属性,描述一个固定的姿态,因此在update中把一个四元数赋值给rotation是不会产生动态旋转的效果,但是利用欧拉角和Rotation方法则可以实现不断地旋转。

transform组件的属性

Vector3 position 游戏对象在世界坐标系中的坐标

Vector3 right、up、forward 游戏对象的3个轴在世界坐标系中的方向

Quaternion rotation、 localRotation 分别是世界坐标系和本地坐标系中的四元数

Vector3 eulerAngles、localEulerAngles 世界坐标系和本地坐标系的欧拉角(用于描述旋转)

Matrix4x4 worldToLocalMatrixlocalToWorldMatrix 世界坐标系与本地坐标系坐的坐标之间互相转换的矩阵

Transform parent 父对象的transform组件

 

transform组件的方法(非静态)

public void LookAt(Transform target)

public void LookAt(Vector3 worldPosition) 使z轴面向指定的对象或坐标(世界坐标系)

 

public void Translate(Vector3 translation);

public void Translate(Vector3 translation, Space relativeTo = Space.Self);

public void Translate(Vector3 translation, Transform relativeTo);

用于控制物体移动,移动到相应的坐标,默认为自身坐标系Space.Self,世界坐标系为Space.World。也可以是某个transform的坐标系。

 

public void Rotate(Vector3 eulers, Space relativeTo = Space.Self)

利用欧拉角进行旋转。

 

void Rotate(float xAngle,float yAngle, float zAngle, Space relativeTo = Space.Self)

x,y,z规定每个轴旋转的角度

 

public void Rotate(Vector3 axis,float angle, Space relativeTo = Space.Self)

在某个轴上选择一定的角度

 

public void RotateAround(Vector3 point, Vector3 axis, float angle)

围绕某个点,以世界坐标系中的某个轴进行旋转,旋转一定的角度。旋转的时候,会自动进行姿态跳转。

 

public void SetParent(Transform p);

public void SetParent(Transform parent, bool worldPositionStays);

为transform组件设定一个父控件

 

public Transform GetChild(int index)

获取子控件

 

public bool IsChildOf(Transform parent);

判断transform是否是另一个transform控件的子控件

 

如果要运动独立于帧率,则要对变量或者增量乘以一个Time.deltaTime

 

Vector3类常用属性和方法

向量的+ - * / 四则运算

判断是否相等用equals方法

 

属性

up down 对于y轴的正负方向

left(负) right(正)对于x轴

forward(正) back(负)对应z轴

one 全1向量

zero 0向量

5、 输入组件input的基本使用方法?如何获取输入信息?

鼠标事件的回调方法(在脚本里面重写即可)

void OnMosueEnter() 鼠标进入游戏对象的那一帧调用

void OnMouseOver() 鼠标在游戏对象上面时每一帧都调用

void OnMouseExit() 鼠标离开游戏对象的那一帧调用

void OnMouseDown() 鼠标在游戏对象上按下去的那一帧调用

void OnMouseUp() 鼠标在游戏对象上弹起来的那一帧调用

 

Input组件(只有静态属性和静态方法)

可以通过Input组件获取鼠标和键盘的输入

 

获取鼠标输入(与回调方法不冲突,并且使用的方式不同)

静态属性

Vector3 mousePosition 鼠标当前的坐标

静态方法

public static bool GetMouseButton(int button); 按键按下时的每一帧都返回true

public static bool GetMouseButtonUP(int button); 按键松开的第一帧返回true

public static bool GetMouseButtonDown(int button); 按键按下的第一帧返回true

0:左击,1:右键 2:中间键

 

public static float GetAxis(string axisName);

axisName:

    Mouse X:一帧内鼠标水平方向移动的距离

    Mouse Y:一帧内鼠标垂直方向移动的距离

    Vertical: 一帧内方向键垂直方向移动的距离

    Horizontal: 一帧内方向键水平方向移动的距离

 

获取键盘输入

public static bool GetKey(string name); 按键按下的每一帧都返回true

public static bool GetKeyUp(string name); 按键弹起的第一帧返回true

public static bool GetKeyDown(string name); 按键按下的第一帧返回true

 

name:

    a-z 0-9 上下左右分别对应 up down left right 空格space

 

6、 相机组件,与Transform组合,调整相机视点。视景体的概念

Screen Space屏幕坐标系

以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡的。

鼠标位置Input.mousePosition获取的是屏幕坐标。

 

Viewport Space视口坐标系

视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。(有可能屏幕显示的,不是相机看到的图像。或者在多个相机的情况下,屏幕坐标系与视口坐标系不能对应。)

 

public Vector3 ViewportToScreenPoint(Vector3 position);视口坐标 转 屏幕坐标

public Vector3 ViewportToWorldPoint(Vector3 position); 视口坐标 转 世界坐标

public Vector3 WorldToScreenPoint(Vector3 position); 世界坐标 转 屏幕坐标

public Vector3 WorldToViewportPoint(Vector3 position); 世界坐标 转 视口坐标

public Vector3 ScreenToViewportPoint(Vector3 position); 屏幕坐标 转 视口坐标

public Vector3 ScreenToViewportPoint(Vector3 position); 屏幕坐标 转 世界坐标

public Ray ViewportPointToRay(Vector3 pos); 从视口坐标发射一条射线

public Ray ScreenPointToRay(Vector3 pos); 从屏幕坐标发射一条射线

7、 物理组件,RigidBody和Collider

RigidBody(使用了刚体,就不能再用transform组件,否则会出现异常)

可以在inspector中勾选gravity表示使用重力

 

属性

public float mass; 质量

public Vector3 velocity; 速度,可以通过对游戏对象的刚体组件的速度赋值,给其一个初速度

 

public void AddForce(Vector3 force, ForceMode mode = ForceMode.Force);

public void AddForce(float x, float y, float z, ForceMode mode = ForceMode.Force);

给一个刚体加力,默认为质心。

力的四种模式

ForceMode.Force 恒力

ForceMode.Accleration 恒加速度

ForceMode.Impluse 瞬间力

ForceMode.VelocityChange 瞬时加速度

 

public void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode = ForceMode.Force);

在世界坐标系position上,施加一个力

 

void AddRelativeForce(Vector3 force, ForceMode mode = ForceMode.Force);

public void AddRelativeForce(float x, float y, float z, ForceMode mode = ForceMode.Force);

给刚体施加一个力,这个力是相对本地坐标系而言

 

void AddTorque(Vector3 torque, ForceMode mode = ForceMode.Force);

AddTorque(float x, float y, float z, ForceMode mode = ForceMode.Force);

在刚体上,施加一个力矩

 

 void AddRelativeForce(Vector3 force, ForceMode mode = ForceMode.Force);

public void AddRelativeForce(float x, float y, float z, ForceMode mode = ForceMode.Force);

给刚体施加一个力,这个力是相对本地坐标系而言

 

void AddRelativeTorque(Vector3 torque, ForceMode mode = ForceMode.Force);

void AddRelativeTorque(float x, float y, float z, ForceMode mode = ForceMode.Force);

给刚体施加一个力矩,这个力矩是相对本地坐标系而言。

 

public void MovePosition(Vector3 position);

把刚体移动到世界坐标系中的position

 

public void MoveRotation(Quaternion rot);

通过四元数设定刚体的姿态

 

Collier组件

 

编辑器inspector中属性

is Trigger 勾选后会触发回调,但是不会产生物理效应

Material 物理材质,包括动摩擦力,静摩擦力,弹性系数

 

属性

public PhysicMaterial material;

 

PhysicMaterial介绍

属性

bounciness 弹性系数,0~1之间,0表示完全非弹性,1表示完全弹性

bounceCombine 碰撞时弹性系数的使用方法,默认为average。

dynamicFirction 动摩擦系数0-1之间

staticFirction 静摩擦系数 0-1之间,0表示完全光滑。

 

public bool enabled;

是否开启碰撞器

 

public bool isTrigger;

与inspector中效果相同。

 

回调方法(在附加在碰撞体的脚本上重写这些方法)

Collider.OnCollisionEnter(Collision Other)

Collider.OnCollisionStay(Collision Other)

Collider.OnCollisionExit(Collision Other)

 

Collider.OnTriggerEnter(Collision Other)

Collider.OnTriggerStay(Collision Other)

Collider.OnTriggerExit(Collision Other)

 

other表示与当本碰撞体发生碰撞的另一个碰撞体

 

enter 在发生碰撞的第一帧调用

stay 碰撞时保持调用

exit 碰撞结束的第一帧调用

 

collision 和 trigger的区别

collision修饰的方法只能在两个碰撞体都没有勾选isTigger的时候才能触发,触发了collision就不会触发tigger,如果其中一个勾选了,则只能触发trigger。

 

Ray射线

属性

Vector3 direction 射线的方向

Vector3 origin 射线的发出点

 

通过摄像机camera发射射线。

RaycastHit 是碰撞信息。

可通过 Physics.Raycast(Ray ray, out hit)来填充碰撞信息

 

属性

collier 被击中的碰撞体

distance 到击中点的距离

point 击中点的世界坐标

transform 击中点的transform组件。可通过其获取被击中的游戏对象。

 

 

8、 MeshFilter、MeshRenderer的概念和使用方法。

Mesh Filter是用了一个从资源里取到的mesh资源,然后通过Mesh Renderer,渲染到屏幕中。

Mesh Renderer规定了渲染的方法、效果,材质等。

Mesh中存储着三维模型的数据:vertices(顶点数据数组Vector3[])、triangles(三角形顶点索引数组,int[])、normals(法线向量数组,Vector3[])、uv(纹理坐标数组,Vector2[])。

 

顶点vertices,用于存储三维模型的所有顶点。而triangles数组,则是组成三角形的顶点的顺序。因为通过三角形渲染出图像,每个三角形越小,渲染出来的效果越好,但是开销也越大。三角形顶点顺序,为顺时针,则是正面,可以渲染出来。逆时针的系统会把其当成背面,不做渲染。

 

在脚本中用代码创建三维模型

创建一个空游戏对象。

为其添加MeshFilter组件。

创建mesh,先设定顶点,再设定顶点顺序,用其对MeshFilter的mesh赋值。

 

创建一个五边形的代码如下

public GameObject GetPentagon () {

    GameObject go = new GameObject ("Pentagon");

    MeshFilter filter = go.AddComponent ();

    Mesh mesh = new Mesh ();

    filter.sharedMesh = mesh;

    mesh.vertices = new Vector3[] { new Vector3 (0, 0, 0), new Vector3 (0, 2, 0), new Vector3 (2, 0, 0), new Vector3 (2, -2, 0), new Vector3 (1, -2, 0),

    };

    mesh.triangles = new int[9] {0, 1, 2, 0, 2, 3, 0, 3, 4};

    mesh.RecalculateNormals ();

    mesh.RecalculateBounds ();

    Material material = new Material (Shader.Find ("Diffuse"));

    material.SetColor ("_Color", Color.yellow);

    MeshRenderer renderer = go.AddComponent ();

    renderer.sharedMaterial = material; return go;

}

 

 

Renderer渲染器

Renderer.material = new Material(Shader.Find(“name”)); 可以设定模型的材质

material.color = Color.。。。 可以设定物体颜色

9、 音效系统的概念,组件及其使用方法,游戏中的多普勒效应

音效系统由3部分组成,AudioClip音频, AudioSource发音的音源,AudioListener声音接收器。

 

AudioClip是导入后的声音文件,有多种属性,请参照书本。

AudioSourec 游戏对象必须有这个组件才能播放声音。

AudioListener 默认相机中会有这个组件,用于接收音频并在设备中输出。

 

播放音频的基本步骤

1、 创建场景

2、 导入声音文件

3、 创建空对象,并添加AudioSource组件

4、 把声音文件拖到AudioSource的AudioClip上,并勾选 play on awake

 

代码播放

 

public class MusicTest : MonoBehaviour {

    // Use this for initialization
    void Start () {
        Debug.Log ("play music");
        AudioClip clip = Resources.Load<AudioClip> ("Audio/m1");
        if (clip == null) {
            Debug.Log ("can not find music file");
        }

        AudioSource sourece = GetComponent<AudioSource> ();
        //sourece.clip = clip;
        sourece.loop = true;
        sourece.volume = 0.2f;
        sourece.spatialBlend = 1.0f;
        sourece.Play ();

    }
    
    // Update is called once per frame
    void Update () {
        
    }
}

 

多普勒效应

在inspector中调整audiosource的spatialBlend,数值为0-1之间,0为2d,1为完全3d。

声源和接收器之间要有相对运动

 

在代码中的话,如上面代码,调整sourece.spatialBlend即可。

 

10、    Light光照组件

光的三种类型

点光 Point 聚光 Spot 方向光 Directional

可以在光照的inspector中设定

 

在Unity 3D中,经常需要用到光照阴影,即Directional Light的Shadow,Shadow分为Hard Shadow和Soft Shadow。区别是Soft Shadow的阴影边缘比较平滑,接近真实,但是性能消耗大于Hard Shadow。

  Lightmapping有3种选择:实时光照阴影(RealTimeOnly)、场景烘焙阴影(BakedOnly)、以及上面两者结合的阴影(Auto)。

  RealTimeOnly:所有场景物体的光照都实时计算,实时光照对性能消耗比较大;

  BakedOnly:只显示被烘焙过的场景的光照效果(如果有地方没有被烘焙过,则不会显示光照效果):场景烘焙是可以选择一些静态物体进行烘焙,这里的静态物体是指在游戏过程中不会动的物体(需要在对象的Inspector面板中勾上static),因此可以在游戏运行前就先把光照效果做好,生成光照贴图,然后游戏运行的时候直接把光照贴图显示出来就可以了,不用实时计算光照效果,用空间(贴图的存储空间)换取了时间(实时光照的计算时间)。

  Auto:这种就是上述两者的结合,如果选择这个模式,那么被烘焙过的部分就用光照贴图直接显示,没有被烘焙过的地方就实时计算。

 

转载于:https://www.cnblogs.com/seafoodmaster/p/10073417.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值