Unity学习心得
来源:互联网 发布:js新建数组对象 编辑:程序博客网 时间:2024/06/07 04:52
Unity学习心得
第一个项目 Roll A Ball
1.基本模型和场景操作
双击Cube,表示聚焦(在Scene场景中)或者按下 F键
Persp:透视视图 (会产生近大远小) ISO:平行视野(不会产生近大远小的效果)
2.世界坐标系和局部坐标系:
世界坐标:以世界原点为中心的坐标 局部坐标:以父节点的中心为原点的坐标
3.对物体常用操作移动缩放旋转:
默认单位:m 快捷键集合:QWER
红色轴:x轴 蓝色轴:z轴 绿色轴:y轴
4.修改游戏物体的名字:
选中游戏物体,按下F2键
5.给地面赋予材质:
project面板中创建Material文件夹———->右键create Material———–>Albedle(修改材质球的颜色)
6.给小球添加刚体组件:Rigidbody (使游戏物体拥有物理效果)
7.声明一个指向Rigidbody组件的变量:
private Rigidbody rd; rd = GetComponent<Rigidbody>();
8.如何使小球运动起来:
rd.AddForce(new Vector3(x,y,z));
x,y,z的正负——->力的方向
x,y,z的大小————->力的大小
9.通过按键来控制小球:
[左右移动]:
获取用户水平轴的输入:
float h = Input.GetAxis("Horizontal");按下A键:h=-1; 按下D键:h=1;
[前后移动]:
float v = Input.GetAxis("Vertical");
按下S键:h=-1; 按下W键:h=1;
10.如何控制施加力的大小:
定义一个 force:
public int force; rd.AddForce(new Vector3(h,0,v)*force);
11.相机的跟随:
(1).将相机拖拽至目标物体下,作为其子物体。
(2).通过脚本FollowTarget
FollowTarget脚本:
a.创建跟随目标的tranform组件(获取目标的坐标):
public Transform TargetTransform;
b.计算相机与跟随目标的偏移:
offest = transform.position - TargetTransform.position;
c.保持相机和跟随目标的偏移(offset)不变:
transform.position = TargetTransform.position + offset;
12.预制体:
相当于一个模板,修改其参数,场景中所有由它复制的物体相应的参数均会改变
13.控制食物旋转:
在预制体上添加脚本:PickUp:
void Update (){ transform.Rotate(new Vector3(1,0,0));}
14.碰撞检测:
onCollisionEnter: 碰撞发生时(仅发生一次)
onCollisionExit: 碰撞结束后(仅发生一次)
onCollisionStay: 两个物体挨在一起(触发多次)
void OnCollisionEnter(Collision collision) //collision表示碰撞到的物体{ //获取碰撞到物体的名字 string name=collision.collider.name; //collision.collider表示获取碰撞到物体的碰撞组件 print(name);//控制台的输出}
如何获取到碰撞到的游戏物体对象:
collision.collider.gameObject
销毁碰撞到的游戏物体:
Destroy(collision.collider.gameObject);
出现的问题:两个物体碰撞时,会发生轻微反弹(即物理效果)
如何解决:将]碰撞器改为触发器:
Box Collider:勾上Is Trigger
void OnTriggerEnter(Collider collider){ if (collider.tag == "PickUp") { Destroy(collider.gameObject); }}
15.分数的统计:
定义存储分数的变量score:
private int score=0;
右键 create UI——>text
白色线框代表整个屏幕范围
定义Text 组件:
public Text text;
更新分数:
text.text = score.ToString();
在Hierarchy面板中,选中Text 按住Alt键,可以等比例放大缩小text
胜利文本的显示:在代码中激活文本物体:
//创建”胜利文本对象“ public GameObject winText; //激活文本对象:
16.总结:
如果在脚本中要控制一个游戏物体:
则定义一个该物体类型:
pulbic GameObject gameobject
如果在脚本中要操作(修改)某个游戏物体的某个组件:则定义为:
public 组件类型(如 Transform ,Text, Rigidbody等) xxx
17.游戏的发布:
buildsetting——->将所有场景拖至buildsetting中——–>pc版本,单击switch platform———->选86位或64位———->build——–.>命名
第二个项目 我的世界(Minercraft)
1.按住Ctrl键可以一个单位移动游戏物体
2.创建角色控制器:
unity标准资源中,FPSController/RigidBodyFPSController
3.给物体添加透明材质:
在给物体添加一张Grass001的贴图后,Grass001:shader—->Mobile——–>Particles——–>Multiply
4.控制我的世界中日夜的旋转:
(Direction Light 和场景中的太阳旋转是一样的)
获取系统的时间间隔:
Time.deltaTime
5.物体围绕自身向上旋转:
transform.Rotate(Vector3.up*rotateSpeed*Time.deltaTime,Space.Self);
6.判断场景中某个游戏物体是否激活:
if (bodyInventory.activeInHierarchy == true)
7.判断游戏物体上某个组件是否被激活:
isActiveAndEnable
第三个项目:如何制作塔防游戏(TowerDefenseProject)
1.如何让一个游戏物体与预制体解除关联:GameObject————–>Break Prefabs Instance
2.控制相机视野的移动放大和缩小:
float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical"); //获取鼠标滚轮的输入值 float mouse = Input.GetAxis("Mouse ScrollWheel"); transform.Translate(new Vector3(-h*speed, mouse*mouseSpeed, -v*speed) * Time.deltaTime, Space.World);
3.如何获取一个游戏物体下的所有子物体:
例:敌人路径的管理:
public static Transform[] positions;void Awake(){ positions = new Transform[transform.childCount]; for (int i = 0; i < positions.Length; i++) { positions[i] = transform.GetChild(i); }}
4.启动一个协程:
StartCoroutine();
5.Input.GetMouseButtonDown(value)
在Update()中调用这个方法,此后每一帧重置状态时,它将不会返回true,除非用户释放这个鼠标按钮然后重新按下它,
value=0 对应左键,
value=1 对应右键,
value=2 对应中键。
6.射线检测:
//返回一条经过摄像机和指定点的射线Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; bool isCollider = Physics.Raycast(ray, out hit, 1000, LayerMask.GetMask("MapCub"));
ray 射线的起点和方向
hit 包含碰撞到物体的信息
distance 射线的长度
layermask 投射射线,选择投射层的蒙版
Returns 返回值 当光线投射与任何碰撞器交叉时为真,否则为假。
7.为了在unity面板中隐藏某个属性,在脚本中可以用 [HideInInspector]来修饰,
例如:
[HideInInspector] public GameObject turretGo;
8.触发检测:
//进入触发器void OnTriggerEnter(Collider col){ enemys.Add(col.gameObject);}//离开触发器 void OnTriggerExit(Collider col){ enemys.Remove(col.gameObject);}
9.让游戏暂一段时间:
yield return new WaitForSeconds(time)yield return new WaitForSeconds(0.8f);
10.使某个物体旋转“望”向运动的物体:
head.LookAt(targetPosition);
11.定义一个协程:
IEnumerator SpawnEnemy()//开始执行协程 coroutine=StartCoroutine(SpawnEnemy());//停止执行协程 StopCoroutine(coroutine);
11.协程的三大要点:
1.返回值是IEnumerator
2.返回参数时 ,使用:yeild return null/0;
3.调用时,StartCoroutine(method());
12.“重玩”和“菜单”按钮的设定
//“Again”和”Menu“按钮public void ButtonRetry(){ SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);}public void ButtonMenu(){ SceneManager.LoadScene(0);}
13.“开始游戏”和“退出”按钮:
public void OnStartGame() { SceneManager.LoadScene(1); } public void OnExitGame() { Application.Quit(); }
Unity进阶
特效组件
1.TrialRenderer(拖尾渲染组件)
如何创建?
(1).新建一个空的游戏物体
(2).给这个物体添加TrialRenderer组件
制作透明材质球
(1)创建一个材质球
(2)设置该材质球的Shader为Particles/Additive;(粒子/添加物)
(3)给材质球拖拽赋予贴图
TrialRenderer常用属性
(1).Time 设置拖尾特效的持续时间
(2).Start Width 设置拖尾开始时的宽度
LineRenderer 线渲染器
常用属性:
Position: 设置线开始点和结束点的位置
声音组件
1.AudioSource
AudioClip 音频剪辑
常用属性:
Play On Awake(唤醒时开始播放)
勾选之后,在游戏运行起来之后,就会开始播放
Mute(静音)
Spatial Blend(空间混合)
设置声音是2D还是3D声音,为0时,2D,为1时 3D。
2.AudioListener组件 (声音侦听器)
默认状态下,它是挂在摄像机上的
AudioSource常用函数
play();
stop();
pause();
3.常用API之实例化和销毁
实例化
GameObject.instantate(Object,Vector3,Quaternion)
Object: 用于实例化的预制体
Vector3: 实例化后生成物体所在的位置
Quaternion[四元素]: 实例化后生成物体的旋转状态
Quaternion.identity:无旋转
4.构造随机位置:
//生成随机数Random.Range(min,max);
5.销毁
//定时销毁某个游戏物体GameObject.Destroy(Object,float); 定时销毁某个游戏物体
Object:要销毁的游戏物体
float:多少秒后销毁
6.Invoke()函数
Invoke(String,float) 多少秒后执行某个函数,只会调用一次
String:要执行函数的名称
float:倒计时的时间
7.InvokeRepeating(String,float,float)
String:要执行函数的名称
float:准备时间,预备时间
float:重复要调用的时间间隔
CancelInvoke() 取消这个脚本中的所有Invoke()调用
8.主角基本控制
(1).添加刚体组件,使用刚体的MovePosition结合按键控制主角移动
private Rigidbody player; private Transform transform;void Start (){ player = GetComponent<Rigidbody>(); transform = GetComponent<Transform>();}void Update () { if (Input.GetKey(KeyCode.W)) { player.MovePosition(transform.position+Vector3.forward*0.2f); } if (Input.GetKey(KeyCode.S)) { player.MovePosition(transform.position + Vector3.back * 0.2f); } if (Input.GetKey(KeyCode.A)) { player.MovePosition(transform.position + Vector3.left * 0.2f); } if (Input.GetKey(KeyCode.D)) { player.MovePosition(transform.position + Vector3.right * 0.2f); }}void OnCollisionEnter(Collision coll){ if (coll.gameObject.tag == "Box") { Destroy(coll.gameObject); }}
9.消息发送
SendMessage(String)
String: 要发送消息的方法
10.协同程序
协同程序的使用前提:只有在继承了“MonoBehaviour”这个类的子类中才能使用相关的协程方法。
IEnumerator Task3(){yeild return new WaitforSeconds(2);Debug.Log("任务3");}
参数说明:
IEnumerator: 协同程序的返回值类型;
yeild Return : 协同程序返回xxx
new WaitforSeconds(s):实例化一个对象,等待多少秒后继续执行
11.脚本的生命周期
1.Awake() 唤醒事件, 只执行一次。
2.OnEnable() 启用事件,只执行一次。当脚本组件被启用的时候执行一次。
3.Start()
4.FixedUpdate()
固定更新事件,执行N次,0.02秒执行一次,
5.Update()
更新事件,执行N次,每帧执行一次
6.LateUpdate()
7.OnDestroy()
销毁事件,执行一次。当脚本所挂载的游戏物体被销毁时执行。
12.常用类
Screen类
Screen.height 只读属性,屏幕的高度
Screen.width 只读属性,屏幕的宽度
Time类
常用属性:
Time.time 静态只读属性,从游戏开始到现在所经过的秒数
Time.delta time 静态只读属性,时间增量
Mathf数学类
常用函数
Mathf.Abs()
Mathf.Max()
Mathf.Min()
Mathf.Round()
插值运算函数
Mathf.Lerp(float a,float b,float t):插值运算
基于浮点数t返回a到b之间的插值,t限制在0~1之间。
当t=0时,返回a,当t=1时,返回b.
当t=0.5,返回a和b之间的平均值
13.物理射线
创建方法:
通过摄像机创建
Camer.main 代表tag设置为”MainCamera”的摄像机的Camera组件的引用
Input.mousePosition 鼠标所在的位置值
Ray 射线,结构体
//返回的是一个Ray类型的射线Camera.main. ScreenPointToRay(Vector3);
检查射线与其它物体的碰撞
RayCastHit 一个结构体,用于射线的碰撞信息。
RayCastHit.point 获取射线碰撞点
Physics.Raycast(Ray,out RaycastHit) 静态方法Raycast(),射线检查
检查这根射线,如果射线与场景中的物理碰撞了,返回值为空,并且将碰撞的信息存储到RaycastHit类型的变量中。
Vector3向量计算方向
向量A-向量B=一个从B点到A点的方向
Debug 绘制射线(只能在scene窗口中看到)
Debug.DrawRay(Vector3,Vector3,Color): 绘制射线
第一个Vector3:起点的位置
第二个Vector3: 终点减去起点得到的一个方向
Color: 射线显示的颜色
Debug.DrawLine(Vector3,Vector3,Color); 绘制线
Vector3: 绘制线的起始位置
Vector3: 绘制线的结束位置
Color: 绘制线显示的颜色
Transform.FindChild(string): 在当前物体的子物体中查找游戏物体
Transform.parent 属性 当前物体的父物体
GetComponentsInChildren() 获取所有子物体的某个组件、
GameObject.AddComponent() 给游戏物体添加组件
transform.SetParent(Transform) 将当前物体设置为另一个物体的子物体
游戏管理器框架编写
(1)创建当前游戏状态枚举,当前游戏只有三种状态:开始,游戏中,结束
(2)查找获取三组UI的引用,并控制它们的显示次序
(3)定义一个字段存储当前的游戏状态
(4)定义一个切换游戏状态的方法
(5)通过背景声音和UI显示状态切换的效果
- Unity学习心得
- 2013-1-4 unity学习心得
- unity 插件iTween 官方例子学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- UVA 424 Integer Inquiry (高精度加法)
- 【BZOJ4403】【lucas】【组合数】序列统计 题解
- 【BZOJ】4719 [Noip2016]天天爱跑步 LCA+树上差分
- 7-3 树的同构(25 分)
- 用router-link做一个底部导航组件
- Unity学习心得
- Rocksdb Merge Operator
- split分隔符无法使用解决办法
- 打包和压缩文件
- Linux下启动oracle
- SpringBoot——自动配置依赖[spring-boot-starter-XXX]
- aspect_level情感分析(持续更新)
- php实现websocket实时消息推送
- [thinkPHP5项目实战_20]友情链接功能完善