Unity小记
来源:互联网 发布:黑马java培训怎么样 编辑:程序博客网 时间:2024/06/03 15:34
GDGeek工具集介绍:
FSM:方便开发的有限状态机库,特点是可以支持多层次的有限状态机结构
JsonFx:使用广泛的Json解析工具,GDGeek工具集中单独处理了JsonFx对IOS平台的兼容问题
Task:任务管理工具库,基于任务管理工具库游戏中的大部分动作都封装成任务。大大简化开发流程
Toolkits:保存了一些游戏开发中很有价值的代码片段
Tweener:对不同的几个补间动画库综合处理,既提供了可靠的效率又提供了多样性的插值方式。
Web:结合HTTP协议的非持续连接性的网络客户端框架
MVC编程模式:
Model(
模型
):表示应用程序核心(数据库记录列表)
View(视图):显示数据(数据库记录)
Controller(控制器):处理输入(写入数据库记录)
AddForce (x : float, y : float, z : float, mode : ForceMode.mode(mode取持续力Force、Acceleration或瞬间力Impulse、Velocitychange)
添加一个力到刚体。作为结果刚体将开始移动,可以消除脚本移动的抖动效果。
具体用法老版本是rigidbody.addforce(),新版本是GetComponent(Rigidbody).AddForce() 或Getcomponent<Rigidbody>().AddForce(),记得先要给物体添加Rigibody属性。此外给刚体施加力一般写在固定更新函数FixedUpdate()中,2D刚体是Rigibody2D。
移动物体有几种方案:
Character Controller:在使用摄像机游览场景的时候,需要控制摄像机不穿透场景中的物体,这需要用到碰撞。在unity物理引擎中有两类的情况可以检测到碰撞,一种是一方是刚体+碰撞器和另一方碰撞器碰撞(参加碰撞器和刚体),另一种就是Character Controller与其他的碰撞器碰撞的时候。
在使用摄像机游览场景的时候,虽然需要去碰撞检测,但是一个特别的要求就是摄像机和其他物体碰撞之后不能对它们产生任何力的作用,同时摄像机本身也不需要受到模拟真实碰撞的反作用力,也就是说这个时候给摄像机挂载刚体属性还是不大适合的。
这个时候Character Controller就被制作出来满足这种需求,Character Controller本身自带一个碰撞器,无需刚体即可完成触发(Trigger)和碰撞(Collision)功能。
public delegate void EventHandler(GameObject e); public event EventHandler MouseOver; void OnMouseOver () { if (MouseOver != null) MouseOver (this.gameObject); }
void Start () { EventDispatcher ev = GameObject.Find("Cube").GetComponent<EventDispatcher>(); ev.MouseOver += ListeningFunction;//Register the listener(and experience the beauty of overloaded operators!) } void ListeningFunction (GameObject e) { this.transform.Rotate(20, 0, 0); // 'e' is the game object that dispatched the event //e.GetComponent<EventDispatcher>().MouseOver -= ListeningFunction; //Remove the listener Debug.Log("mouse is over: "+e); }
{
p.Play();
}
function Update () { var hit:RaycastHit; if(Physics.Raycast(transform.position,transform.forward,hit,8)) //射线长度8米,不指定时表示无限长 { print("射线触碰了"+hit.collider.gameObject+"物体"); }}
protected void SetDestination(){ var ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit = new RaycastHit();if (Physics.Raycast(ray,out hit)){if(particleClone!= null){GameObject.Destroy(particleClone);particleClone = null;}Quaternion q = new Quaternion();q.SetLookRotation(hit.normal, Vector3.forward); //四元数,由x,y,z和w四个分量组成一个四维空间。unity中基本本的旋转可以通过Transform.Rotate来实现,但是当我们希望对旋转角度进行一些计算的时候,就要用到四元数Quaternion了 particleClone = Instantiate(particle, hit.point, q); //hit.point射线落点agent.destination = hit.point; //agent = GetComponent<UnityEngine.AI.NavMeshAgent>(); }}
GUI.RepeatButton在鼠标点击不松开时会重复执行
GUILayout:根据文本内容自动设置长度和位置,如.LabelGUI.Layout("XXX");
设置一个按钮,当鼠标移动到按钮时能出现小标签提示:
function OnGUI(){if(GUI.Button(Rect(10,10,120,110),GUIConten("button按钮",“这是一个工具提示”))){print("用户单击了按钮");}GUI.label(Rect(10,120,100,20),GUI.tooltip);}GUI动态窗口的实现:
#pragma strictvar windowShoworNot:boolean = true;var windowRect : Rect = Rect (10, 60, 120, 50);function OnGUI(){ windowShoworNot=GUI.Toggle(Rect(10,10,100,20),windowShoworNot,"窗口显示or Not"); if(windowShoworNot) windowRect= GUI.Window(0,windowRect,MyWindowFunction,"我的窗口"); }function MyWindowFunction(windowID : int){ if(GUI.Button(Rect(10,20,100,20),"窗口内按钮")) print ("在窗口控件内被单击"); GUI.DragWindow(Rect(0,0,10000,10000));//窗口在一定范围内可拖动}
Protect Animator animator;public float DirectionDampTime = 0.25f;//if(animator.layerCount>=2) animator.SetLayerWeight(1,1);//设置默认动画层权重1AnimotorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0); //获取当前动画状态,参数代表层的索引处,0表示Base Layerif(stateInfo.IsName("Base Layer.Walk")){ if(Input.GetButton("Fire1")) animator.SetBool("Jump",true); //Jump是Base Layer层中添加的bool型动画参数 else animator.SetBool("Jump",false);}float horizontal = Input.GetAxis("Horzontal");animator.SetFloat("Direction",horizontal,DirectionDampTime,Time.deltaTime);
IK手柄:使用脚本实现人物手抓球体的效果(动画控制器要勾选IK Pass):
protected Animator animator;private bool ikActive = false;public Transform rightHandObj = null; //右手要抓取的目标物体void start(){ animator = GetComponent<Animator>();}void OnAnimatorIK() //Animator组件的回调函数,在调用内部IK系统前调用{ if (animator) { //animator.MatchTarget(position,rotation,AvatarTarget.RightHand,new MatchTargetWeightMask(new Vector3(1,1,1),0),startMatchTime,endMatchTime); if(ikActive) { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1.0f); //设置IK手柄的位置权重,AvatarIKGoal.RightHand为定义好的枚举值,表示右手 animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1.0f); if (rightHandObj) { animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position); animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation); } else { animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 0.0f); animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 0.0f); } //animator.SetLookAtPosition(targetPosition); } }}
动态加载资源:
private GameObject bullet;
GoBullet = Resources.Load("Bullet") as GameObject; //通过资源加载的方法,加载对象Bullet必须放在Resource文件夹下,用这种方法就不用把Gobullet声明成public并拖动Bullet到GoBullet下
协程:协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行,换句话说,开启协同程序就是开启一个线程,关键字如下:
IEnumerator func(); Yield return x; StartCoroutine(func());StopCoroutine("funcName");
注意Yield return 和return不一样,Yield语句是一种特殊类型的返回语句,不会终止该程序的执行,他可以确保函数在下次被执行时从Yield语句处开始,而不是从头开始。可以用Yield WaitForSeconds(3);来等待3秒执行,等待过程系统不会停在此处而是线下继续执行。
具体可以参考:http://blog.csdn.net/huang9012/article/details/38492937
数据结构最常用的是数组,List,字典,队列,其中字典是C++中的map,就是键值key和value一一对应的数据结构,游戏中比如通过下拉菜单选择区服角色时就需要用到字典
c#中字典dictionary的用法和用途:
http://www.cnblogs.com/linzheng/archive/2010/12/13/1904709.html
http://www.cnblogs.com/ccczqh/archive/2011/01/04/1925852.html
c#中 Delegate(委托)类似C和C++中的函数指针,具体:http://www.cnblogs.com/hyddd/archive/2009/07/26/1531538.html
替换新的场景有不同情况:
1.把场景scene保存并设置好顺序,Application.Loadlevel(x),通常用于跳转不同地图,如Pokemon选择有卡或者脱卡后的页面跳转
2.场景做好后设置成预置体,放在Resources/Prefab文件下,Destroy(gameobject)销毁当前场景 ,通过Instantiate(Resources.Load("Prefab/" +xxx)) ad GameObject创建预置体并设置好位置信息来加载新的场景,通常用于UI的改变,如登陆界面->loading->UI
3.通过设置对象的活动状态来实现:gameObject1.SetActive(false);gameObject2.SetActive(true);通常用于同一场景中元素的替换,如五子棋界面跳转,万圣节场景元素依次出现
编辑物体的Inspector的某个组建属性方法:
1.直接面板改;
2.通过脚本GetComponent(Rigidbody).()获取并修改
3.在脚本里public MeshRenderer _mesh = null;;从自身属性面板拖动MeshRenderer组件进去或者创建一个名为对象比如cube拖过去,创建的对象要具有变量类型的属性比如MeshRenderer等才能拖过去,然后就可以在脚本里面_mesh.material.mainTexture = _texutres[value -1]; //material.mainTexture是材质的主纹理,是Material.Texture的一个接口实现。
截透明通道图:texture2D = new Texture2D(800,600,TextureFormat.ARGB32,false);
代码添加贴图:
GameObject myCute; void Start () { myCute = GameObject.Find("Cube"); myCute.renderer.material.mainTexture = Resources.Load("images/zjy") as Texture;}
绘制纹理:
private var oneTexture:Texture2D;oneTexture = Resource.Load("Texture/Grass");if(oneTexture != null) GUI.DrawTexture(Rect(110,20,120,120),oneTexture,ScaleMode.StretchToFill,true,0);static function CreatePrimitive (type : PrimitiveType) : GameObject,创建一个带有基本网格渲染器和相应碰撞器的游戏物体,如:
var cube : GameObject = GameObject.CreatePrimitive(PrimitiveType.Cube);cube.transform.position = Vector3(0, 0.5, 0);
Shader着色器http://blog.csdn.net/poem_qianmo/article/category/2681301 和http://blog.csdn.net/zhuangyou123/article/details/26077783
对于游戏中对物体施加力使物体移动后,如果力大一点可能出现物体贴在平台比如梯子的边缘而不掉下去,解决此种问题可以在平台边缘加一个碰撞器,并在材质上指定添加一个摩擦力Friction为0的物理材质Physic Material即可
地图编辑器,六角形导航网格:Tile Based Map and Nav
============================================================================
<Input>
- // 手指刚触摸到屏幕的时候
- Input.GetTouch(0).phase == TouchPhase.Began;
- // 手指在屏幕上移动
- Input.GetTouch(0).phase == TouchPhase.Moved;
- // 手指触摸屏幕,但并未移动
- Input.GetTouch(0).phase == TouchPhase.Stationary;
- // 手指从屏幕上移开,这是一个触控的最后状态
- Input.GetTouch(0).phase == TouchPhase.Ended;
- // 系统取消追踪触控。这常发生在用户把屏幕放到脸上或者同时触控超过了5根手指,同样也是触控的最后一个状态
- Input.GetTouch(0).phase == TouchPhase.Canceled;
unity常用事件响应函数:OnMouseEnter 鼠标移入GUI控件或者碰撞时才响应
OnMouseOver 鼠标停留GUI控件或者碰撞时才响应
OnMouseExit 鼠标移出GUI控件或者碰撞时才响应
OnMouseDown 鼠标按下GUI控件或者碰撞时才响应
OnMouseUp 鼠标释放GUI控件或者碰撞时才响应
OnTriggerEnter 当其他碰撞进入触发器的时候调用
OnTriggerExit 当其他碰撞离开触发器的时候调用
OnTriggerStar 当其他碰撞处于触发器的时候调用
OnCollisionEnter 当其碰撞或者刚体与其他碰撞器或者刚体发生碰撞响应
OnCollisionStar 当其碰撞或者刚体停留其他碰撞器或者刚体发生碰撞响应
OnCollisionExit 当其碰撞或者刚体离开其他碰撞器或者刚体发生响应
OnControllerColliderHit 当控制器移动时与碰撞体发生碰撞时调用
OnBecameVisible 对于任意一个相机可见时调用
OnBecameInVisible 对于任意一个相机不可见时调用
OnEnable 对象启用或者激活状态时调用
OnDisable 对象禁用或者取消激活时候调用
OnDestroy 脚本销毁时候调用
OnGUI 渲染GUI和处理GUI消息时调用
下面是Input类的成员变量:
下面是Input类的成员函数:
Input输入与控制详细看PDF《Unity 5.x从入门到精通》第二十章
GetKey和Getbutton区别:
(1)GetKey两种参数形式Input.GetKey("up")和Input.GetKey(KeyCode.UpArrow),参数是虚拟按键的映射键值,常用于需要检测按键数值范围
(2)GetButton:Input:GetButtonDown("Fire1"),即参数是虚拟按键的名称,常用于检测事件性按键比如开火,不需要关心按键范围
在OnGUI()函数里面 var e : Event = Event.current; if(e.isMouse && e.button == 0/1/2/>2)分别代表鼠标各按键,但是OnGUI函数一帧会被执行多次,所以会出现多次执行的情况;if(e.isMouse && e.clickCount ==2)代表用户双击了鼠标
-------------------------------------------
1. 移动平台上播放视频,提示错误error CS0246: The type or namespace name `MovieTexture' could not be found. Are you missing a using directive or an assembly reference?经测试以上的方式在IOS和Android设备中是无法播放视频的,在移动设备上我们需要使用另外一种方式来播放。movetecture这种方法在移动平台是没法使用的。有另外一种方法,用UI来播放:using UnityEngine;using System.Collections; public class Test : MonoBehaviour { void OnGUI(){ if (GUI.Button (new Rect (20,10,200,50), "PLAY ControlMode.CancelOnTouch")) { Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);} if (GUI.Button (new Rect (20,90,200,25), "PLAY ControlMode.Full")) { Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Full);} if (GUI.Button (new Rect (20,170,200,25), "PLAY ControlMode.Hidden")) { Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Hidden);} if (GUI.Button (new Rect (20,250,200,25), "PLAY ControlMode.Minimal")) { Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Minimal);} }2.的
- Unity 小记
- Unity小记
- unity小记一则
- 关于unity里色彩空间与光照小记
- Unity X C#小记之Array/List/Dictionary的杂七杂八
- Unity X C#小记之引用其他C#文件
- unity项目小记_QQ类信息接收UI机制
- unity项目小记_Unity3D多人协作开发环境搭建
- unity项目小记_unity webplayer Failed to update unity web player错误解决办法
- 小记
- 小记
- 小记
- 小记
- 小记
- 小记
- 小记
- 小记.
- 小记
- Python3的环境配置
- vue v-for详解
- iOS APP启动(执行)顺序~详解
- JDK环境变量
- React Native CodePush实践小结
- Unity小记
- shell命令之cp
- Markdown插入视频
- 网络协议---TCP/IP模型与OSI模型
- Linux服务器命令学习笔记
- 沪C转沪大牌方式及流程
- 从云服务器硬盘更换认识备份、快照、镜像
- 解决linux-deepin无法安装python-dev的问题
- 自动http://下载问题