[Unity] 常用技巧收集
Unity 屏幕旋转
- void Update () {
- //处理横向两个方向旋转
- if(Input.deviceOrientation == DeviceOrientation.LandscapeLeft)
- {
- if (Screen.orientation != ScreenOrientation.LandscapeLeft) {
- Screen.orientation = ScreenOrientation.LandscapeLeft;
- }
- }else if(Input.deviceOrientation == DeviceOrientation.LandscapeRight)
- {
- if (Screen.orientation != ScreenOrientation.LandscapeRight) {
- Screen.orientation = ScreenOrientation.LandscapeRight;
- }
- }else
- //处理纵向两个方向的旋转
- if(Input.deviceOrientation == DeviceOrientation.Portrait)
- {
- if (Screen.orientation != ScreenOrientation.Portrait) {
- Screen.orientation = ScreenOrientation.Portrait;
- }
- }else if(Input.deviceOrientation == DeviceOrientation.PortraitUpsideDown)
- {
- if (Screen.orientation != ScreenOrientation.PortraitUpsideDown) {
- Screen.orientation = ScreenOrientation.PortraitUpsideDown;
- }
- }
- }
Unity 镜头拉近效果(带缓冲)
- var target : Transform;
- var distance : float = 3.0;
- var height : float = 1.0;
- var damping : float = 5.0;
- var smoothRotation : boolean = true;
- var rotationDamping : float = 10.0;
- var targetLookAtOffset : Vector3; // allows offsetting of camera lookAt, very useful for low bumper heights
- var bumperDistanceCheck : float = 2.5; // length of bumper ray
- var bumperCameraHeight : float = 1.0; // adjust camera height while bumping
- var bumperRayOffset : Vector3; // allows offset of the bumper ray from target origin
- function FixedUpdate() {
- var wantedPosition = target.TransformPoint(, height, -distance);
- // check to see if there is anything behind the target
- var hit : RaycastHit;
- var back = target.transform.TransformDirection(- * Vector3.forward);
- // cast the bumper ray out from rear and check to see if there is anything behind
- if (Physics.Raycast(target.TransformPoint(bumperRayOffset), back, hit, bumperDistanceCheck)) {
- // clamp wanted position to hit position
- wantedPosition.x = hit.point.x;
- wantedPosition.z = hit.point.z;
- wantedPosition.y = Mathf.Lerp(hit.point.y + bumperCameraHeight, wantedPosition.y, Time.deltaTime * damping);
- }
- transform.position = Vector3.Lerp(transform.position, wantedPosition, Time.deltaTime * damping);
- var lookPosition : Vector3 = target.TransformPoint(targetLookAtOffset);
- if (smoothRotation) {
- var wantedRotation : Quaternion = Quaternion.LookRotation(lookPosition - transform.position, target.up);
- transform.rotation = Quaternion.Slerp(transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
- } else {
- transform.rotation = Quaternion.LookRotation(lookPosition - transform.position, target.up);
- }
- }
Untiy 动画加速
- for (var state : AnimationState in animation)
- {
- state.speed = 0.5;
- }
Unith3D判断物体是否在视角内
- public var isRendering:boolean=false;
- private var lastTime:float=;
- private var curtTime:float=;
- function Update()
- {
- isRendering=curtTime!=lastTime?true:false;
- lastTime=curtTime;
- }
- function OnWillRenderObject()
- {
- curtTime=Time.time;
- }
如何判断Unity3D角色动作播放结束
- bool AnimationStillPlaying( string animationName )
- {
- return _animation.IsPlaying(animationName) && _animation[animationName].normalizedTime<1.0f;
- }
- normalizedTime: 范围0 -- , 0是动作开始,1是动作结束
利用Quaternion.LookRotation API 将旋转矩阵转换成四元数
- Quaternion.LookRotation
- private static Quaternion QuaternionLookRotation(Vector3 forward, Vector3 up)
- {
- forward.Normalize();
- Vector3 vector = Vector3.Normalize(forward);
- Vector3 vector2 = Vector3.Normalize(Vector3.Cross(up, vector));
- Vector3 vector3 = Vector3.Cross(vector, vector2);
- var m00 = vector2.x;
- var m01 = vector2.y;
- var m02 = vector2.z;
- var m10 = vector3.x;
- var m11 = vector3.y;
- var m12 = vector3.z;
- var m20 = vector.x;
- var m21 = vector.y;
- var m22 = vector.z;
- float num8 = (m00 + m11) + m22;
- var quaternion = new Quaternion();
- if (num8 > 0f)
- {
- var num = (float)Math.Sqrt(num8 + 1f);
- quaternion.w = num * 0.5f;
- num = 0.5f / num;
- quaternion.x = (m12 - m21) * num;
- quaternion.y = (m20 - m02) * num;
- quaternion.z = (m01 - m10) * num;
- return quaternion;
- }
- if ((m00 >= m11) && (m00 >= m22))
- {
- var num7 = (float)Math.Sqrt(((1f + m00) - m11) - m22);
- var num4 = 0.5f / num7;
- quaternion.x = 0.5f * num7;
- quaternion.y = (m01 + m10) * num4;
- quaternion.z = (m02 + m20) * num4;
- quaternion.w = (m12 - m21) * num4;
- return quaternion;
- }
- if (m11 > m22)
- {
- var num6 = (float)Math.Sqrt(((1f + m11) - m00) - m22);
- var num3 = 0.5f / num6;
- quaternion.x = (m10+ m01) * num3;
- quaternion.y = 0.5f * num6;
- quaternion.z = (m21 + m12) * num3;
- quaternion.w = (m20 - m02) * num3;
- return quaternion;
- }
- var num5 = (float)Math.Sqrt(((1f + m22) - m00) - m11);
- var num2 = 0.5f / num5;
- quaternion.x = (m20 + m02) * num2;
- quaternion.y = (m21 + m12) * num2;
- quaternion.z = 0.5f * num5;
- quaternion.w = (m01 - m10) * num2;
- return quaternion;
- }
Unity3D判断场景是否加载完成
- 加载场景时要用
- public static AsyncOperation async;
- async = Application.LoadLevelAsync(“SelectCarModelScreen”);
- 在加载场景里写
- if (MainInterfaceGUIScript.async.isDone == false)
- {
- //________没 有加载完要做的事情如Logo__________________________
- }
- else
- {
- //全部加载完成后显示的东东。。
- }
- 说明一点这种方法消耗性能哦
物体运动到指定位置
- int smooth = ;
- Quaternion target = Quaternion.Euler(, , );//目标
- // Dampen towards the target rotation
- transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
- 《《《《《《《《《《《《《《鼠标左键地形 物体移动至点击位置》》》》》》》》》》》》》
- var moveSpeed:int=;//player移动速度
- var player:Transform;//定义一个人物的Transform
- private var endposition : Vector3;
- function Start()
- {
- endposition = player.transform.position;
- }
- function Update ()
- {
- if(Input.GetButtonUp("LeftMouse")){ //LeftMouse是在inputManager中设置的,左键值为mouse 0
- PlayerMove();
- }
- var targetposition=player.TransformPoint(Vector3(,48.8,-));
- transform.position=targetposition;//相机的目标位置,这两句代码的作用是让人物一直处于相机的视野下
- if(endposition != player.transform.position){
- player.position=Vector3.MoveTowards(player.position,endposition,Time.deltaTime*moveSpeed);
- }
- }
- function PlayerMove()
- {
- var cursorScreenPosition:Vector3=Input.mousePosition;//鼠标在屏幕上的位置
- var ray:Ray=Camera.main.ScreenPointToRay(cursorScreenPosition);//在鼠标所在的屏幕位置发出一条射线(暂名该射线为x射线)
- var hit:RaycastHit;
- if(Physics.Raycast(ray,hit)){
- if(hit.collider.gameObject.tag=="Terrain"){//设置地形Tag为Terrain
- endposition = hit.point;
- }
- }
- }
射线测试+使用手势判断是否触碰了某物体
- using unityEngine;
- using System.Collections;
- public class Lu : MonoBehaviour
- {
- public Camera cam;
- // We need to actually hit an object
- RaycastHit hitt = new RaycastHit();
- // Use this for initialization
- void Start()
- {
- }
- // Update is called once per frame
- void Update()
- {
- Ray ray = cam.ScreenPointToRay(Input.mousePosition);
- Physics.Raycast(ray, out hitt, );
- // Debug.DrawLine(cam.transform.position, ray.direction,Color.red);
- if (null != hitt.transform)
- {
- print(hitt.point);//鼠标点击的坐标
- }
- }
- }
- ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- 必须给物体添加碰撞器,比如Box Collider
- 然后在Update中检测手势,此处假设为手指在屏幕上移动
- 主相机的视角(Camera.main)从手指移动处(Input.GetTouch().position)发射射线,设置射线发射距离。
- 当射线碰撞到了带有碰撞器的物体,就会存储该物体的信息。
- [csharp] view plaincopy
- void Update(){
- if(Input.touchCount > && Input.GetTouch().phase == TouchPhase.Moved){
- Ray ray = Camera.main.ScreenPointToRay (Input.GetTouch().position);
- //hit用来存储碰撞物体的信息
- RaycastHit hit;
- //ray表示射线,hit存储物体的信息,1000为设定射线发射的距离
- if(Physics.Raycast (ray, out hit, )){
- print(hit.transform.name.ToString());
- }
- }
- }
实例来创建对象
- //Simple Instantiation of a Prefab at Start
- var thePrefab : GameObject;
- function Start () {
- var instance : GameObject = Instantiate(thePrefab, transform.position, transform.rotation);
- }
- 建立JAVA,把代码拖入到空GameJect上,然后把Prefab拖入到公共变量上,就可以了
声音播放 坐标转换
- var cAudio:AudioClip;
- function Update(){
- }
- function OnMouseDown () {
- var screenSpace = Camera.main.WorldToScreenPoint(transform.position);
- var offset = transform.position - Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x,transform.position.y, screenSpace.z));
- while (Input.GetMouseButton()){
- var curScreenSpace = Vector3(Input.mousePosition.x, transform.position.y, screenSpace.z);
- var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
- if(curPosition!=transform.position){
- audio.Stop();
- audio.clip = cAudio;
- audio.Play();
- }
- transform.position = curPosition;
- yield;
- }
- }
射线 (之鼠标点击的坐标)
- using UnityEngine;
- using System.Collections;
- public class Lu : MonoBehaviour
- {
- public Camera cam;
- // We need to actually hit an object
- RaycastHit hitt = new RaycastHit();
- // Use this for initialization
- void Start()
- {
- }
- // Update is called once per frame
- void Update()
- {
- Ray ray = cam.ScreenPointToRay(Input.mousePosition);
- Physics.Raycast(ray, out hitt, );
- // Debug.DrawLine(cam.transform.position, ray.direction,Color.red);
- if (null != hitt.transform)
- {
- print(hitt.point);//鼠标点击的坐标
- }
- }
- }
拖拽物体的脚本
- function OnMouseDown () {
- var screenSpace = Camera.main.WorldToScreenPoint(transform.position);
- var offset = transform.position - Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
- while (Input.GetMouseButton())
- {
- var curScreenSpace = Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
- var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
- transform.position = curPosition;
- yield;
- }
- }
用指定图片替换鼠标指针
- //用指定图片替换鼠标指针
- var mouse:Texture;
- function Update(){
- Screen.showCursor=false;//隐藏鼠标指针
- }
- function OnGUI{
- var msPos=Input.mousePosition;//鼠标的位置
- GUI.DrawTexture(Rect(msPos.x,Screen.height-msPos.y,,),mouse);
- }
Unity 字体描边
- private void MakeStroke(Rect position,string txtString,Color txtColor,Color outlineColor,int outlineWidth )
- {
- position.y-= outlineWidth;
- GUI.color=outlineColor;
- GUI.Label(position, txtString);
- position.y+=outlineWidth*;
- GUI.Label(position, txtString);
- position.y-=outlineWidth;
- position.x-=outlineWidth;
- GUI.Label(position, txtString);
- position.x+=outlineWidth*;
- GUI.Label(position, txtString);
- position.x-=outlineWidth;
- GUI.color=txtColor;
- GUI.Label(position, txtString);
- }
调用外部的EXE和载入关卡
- using unityEngine;
- using System.Collections;
- public class openexe: MonoBehaviour {
- // Use this for initialization
- void Start () {
- System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();
- Info.FileName = "C:\\Program Files\\Autodesk\\3dsMax8\\3dsmax.exe";
- System.Diagnostics.Process.Start(Info);
- }
- // Update is called once per frame
- void Update () {
- }
- }
- -----------------载入关卡--------------
- function OnGUI ()
- {
- if (GUI.Button(new Rect(,,,),"Start"))
- {
- Application.LoadLevel();
- }
- }
[Unity] 常用技巧收集的更多相关文章
- JavaScript常用技巧总结(持续添加中...)
在我学习过程中收集的一些常用技巧: typeof x !== undifined 判断x是否已定义: x === Object(x) 判断x是否为对象: Object.keys(x).length ...
- AS技巧合集「常用技巧篇」
转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=254723&extra=page%3D2%26filter%3Dautho ...
- C#WebBrowser控件使用教程与技巧收集--苏飞收集
C#WebBrowser控件使用教程与技巧收集--苏飞收集 先来看看常用的方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System. ...
- T-SQL技巧收集——拆分字符串
原文:T-SQL技巧收集--拆分字符串 在开发中,很多时候都需要处理拆分字符串的操作.下面收集了几种方法供大家分享,其中的逗号可以改为多种有需要的符号,但是不能针对多种符号同时存在的例子.有待各位补充 ...
- SHELL脚本编程的常识和VI常用技巧
来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...
- Unity常用常找(二)
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51315050 作者:car ...
- [转帖]Linux Shell常用技巧(五)
Linux Shell常用技巧(五) https://zhuanlan.zhihu.com/p/73451771 1. 变量:在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可 ...
- 【shell 大系】Linux Shell常用技巧
在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...
- oracle存储过程常用技巧
我们在进行pl/sql编程时打交道最多的就是存储过程了.存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识.如:游标的处理,异常的处理,集 ...
随机推荐
- python日常-int和float
首先先看看下面的代码
- 前博客 http://bbs.landingbj.com/mytopic.jsp?action=mytopic&username=57071
在工作学习的过程中,遇到了亮眼的技术点,或者 学习的心得体会,总想要记录下来,或是方便自己,或是帮助如同自己现在这般的新人.前人种树,后人乘凉.享受了前人留下的阴凉,也会考虑自己给后来者种下几棵树苗. ...
- [转]JVM调优总结:一些概念
JVM调优总结:一些概念 原文出处: pengjiaheng 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变 ...
- 扩展easyUI tab控件,添加加载遮罩效果
项目里要用HighChart显示图表,如果返回的数量量太多,生成图表是一个很耗时的过程.tab控件又没有显示遮罩的设置(至少本菜是没有找到), Google了一下,根据另一个兄台写的方法,拿来改造了一 ...
- JAVA基本类型的转换
1.String转成Int 例1: String str = "123"; try { int a = Integer.parseInt(str); } catch (Number ...
- 【BZOJ-1367】sequence 可并堆+中位数
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 932 Solved: 348[Submit][S ...
- 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)
3589: 动态树 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 405 Solved: 137[Submit][Status][Discuss] ...
- 【BZOJ-1857】传送带 三分套三分
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 1077 Solved: 575[Submit][Status][ ...
- 解析window.open链接的参数
); var arr = new Array(); arr = str.split("&"); ){ ; i<arr.length; i++){ ){ ); if(p ...
- Scala implicit
Scala implicit implicit基本含义 在Scala中有一个关键字是implicit, 之前一直不知道这个货是干什么的,今天整理了一下. 我们先来看一个例子: def display( ...