2017-12-21 18:23:27 hanxiaoyuan32 阅读数 3400

Unity3D

Unity基本操作

Unity基本单位为米,ue4是厘米

Rotation 为度,监事面板是角度,代码里计算的结果是弧度

Scale的单位是倍数。负数为左右镜像

 

创建工程

必要文件夹:

Sences

Scripts

Prefabs

 

工程结构

 

Assets所有素材都在里面,迁移必须

Library临时文件库,迁移工程时不拷贝,临时生成

ProjectSettings 项目设置-projecversion 项目版本号,迁移必须

Temp缓存文件,可以不拷贝。

Meta文件都是unity生成的导入配置信息,例如图片的分辨率,压缩方式,版本控制时,例如svn一般不上传。

X轴旋转到正负90度,会发生万向死锁

组成

Scene(场景)

编辑游戏中所有的内容

右键控制视角,右键+w/s/a/d,对应视角移动操作。

按住鼠标中间切换移动,松开切换回来

Game(游戏窗口)

游戏中真正显示的内容

Project(资源窗口)

包含项目中所有的资源,对应工程下Asset目录

右键-show in exploder  打开对应文件夹

Hierachy(对象实例化的窗口)

游戏世界中所包含的内容。

Inspector(信息面板、检视面板)

Console(控制台)

Debug.Log();

Unity中视觉窗口所有内容都称为Gameobject

坐标

Unity2d的(00)点是game窗口左下角。3d使用左手坐标系。

相对坐标和绝对坐标

库函数

UnityEngine->unity库。

class只有继承了MonoBehaviour才能挂到gameobject身上

DeBug

日志输出

Log 输出,黑色

LogError 打印红色日志,错误

LogWarning 打印黄色警告日志

属性

name属性是当前脚本所在游戏物体的名字

警告处理

1、如果出现了the referenced(引用) script  on this Behaviour is missing ,选中后下发有描述,一般此错误有两种可能,一是脚本被删除,二是脚本名或类名被改变了。

2、如果脚本丢失,建议先删除再重新添加。

3、脚本名必须和类名一致

错误处理

error CS0103: The name `XXX' does not exist in the current context xxx类不存在

error CS1501: No overload for method `xxxx' takes `n' arguments  xxxx方法参数数量有误

unity对大小写敏感。

NullReferenceException(异常): Object reference not set to an instance of an object空引用异常

error CS0266: Cannot implicitly convert type `UnityEngine.Component' to `UnityEngine.Transform'. An explicit conversion exists (are you missing a cast?) 不能转换类型

消息函数

不是主动调用,通过消息机制调用的函数。例如start()update()

SendMessage()发送消息的方法,所有的gameobject对象都可以调用。但不要使用sendmessage,因为效率很低。

生命周期

Awake() 脚本实例化时调用,一般用于初始化,脚本开始只执行一次,Awake在初始化之前调用,在Awake中调用不到其他函数,因为可能还没有初始化。

Start() 脚本第一次启用update前调用(Awake之后执行),也用于初始化,但不同与Awake后于Awake调用

Onenble当组件被激活的时候执行(脚本激活时)。

Ondisable当组件被失活的时候执行。

Update() 运行时,每帧调用。屏幕刷新一遍为一帧,人眼为24

FixedUpdate() update()的帧长不同,FixedUpdate先执行,它的每帧时间完全固定0.02,每帧时间可以在unity中设置,edit中,倒数第三个选项,主要应用于物理受力处理

OnDestroy() 该脚本被移除时调用,同时对应物体被删除时也会调用。(其实还是脚本被删除时调用,删除物体同时也删除了脚本,先删除组件后,再删除物体就不会触发。)

OnGUI(),每一帧调用,和update相同,负责绘制屏幕(game窗口),使用的APIGUI 的类。

物理生命周期

OnCollisionEnter(Collision); 当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionEnter将被调用

OnCollisionExit(Collision)当此collider/rigidbody停止触发另一个rigidbody/collider时,OnCollisionExit将被调用。

OnCollisionStay(Collision)当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用。

OnTriggerEnter 

Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter

OnTriggerEnter2D 

当另一个对象进入到这个对象附加的触发碰撞器时发送消息(仅2D物理)。

OnTriggerExit 

Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit

OnTriggerExit2D 

当另一个对象离开附加在这个对象的触发碰撞器时发送消息(仅2D物理)。

OnTriggerStay 

当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用。

OnTriggerStay2D 

当另一个对象停留在这个对象附加的触发碰撞器内时,每帧发送消息(仅2D物理)。

预制体prefab

场景内容是临时存在的,预制体是永久存在的,所以,场景内的物体拖不到预制体的代码中。

创建预制体

将物体直接拖到资源窗口,就能自动创建预制体

游戏中使用预制体的物体,最上方或多出三个属性:select(选中当前使用预制体的文件),apply(应用修改的数据到预制体,所有使用此预制体的物体都会改变),revert点击会恢复默认的预制体数据。

 

加载预制体

加载预制体,就必须把预制体放在Resources目录下,通过Resources.Load(路径)获取预制体,然后通过Instantiate()实例化。

禁忌:禁止直接使用预制体,因为这样会在运行期间直接修改预制体的数据,停止运行后预制体数据不会还原

Resources目录

该目录属于unity官方指定目录,必须使用此名字,存放资源使用。

一般存放预制体,贴图,音效等内容。

加载通过Resources.Load(“路径及文件名”),或者Resources.Load<T>(路径及文件名);

路径根起点默认为Resources,因此不用写Resources

例如:Resources.Load<GameObject>(“A”);

加载后需要通过实例方法(Instantiate())添加到世界中。

Instantiate(original: Object, position: Vector3, rotation: Quaternion) 克隆原始物体并返回克隆物体。

Resurces.load是堵塞性加载,加载内容时程序会一直停在这里,加载完成时才会继续往下执行。

Resurces.load加载后,不使用了需要释放掉,否则会一直在内存中加载,使用Resources.UnloadAsset(变量名); 随后变量名一定要置空,否则该变量会变成一个未知指向的野指针。

不要在update中使用Resurces.load

动态资源加载(异步资源加载)

Resources.LoadAsync();异步加载。异步加载不会堵塞主线程

返回ResourceRequest类型的对象,该对象继承于AsynOperation

AsynOperation中有一个progress进度函数,该值为0-1,常用于场景切换的进度条。

AsynOperation中有属性isDone,是否加载完成

加载完成的资源在ResourceRequest的对象.asset字段中

异步加载常常配合协程使用。

遇到函数Async结尾一定都是异步,sync肯定是同步的。

场景切换

场景类Application类(早期版本使用)

Application.Quit();退出场景,结束游戏

Application.Load ();已弃用。

SceneManager

使用要先using unityEngine.SceneManager

SceneManager.loadScene(场景索引);

加载场景的异步加载

SceneManager.LoadSceneAsync(场景索引);返回值是asyncOperation类型,也有progress

异步加载完后会自动跳转场景,不会等待指令。

asyncOperationallowSceneActiveation属性改为false后,就不会加载完成后自动跳跃了,但此时进度也会永远变不了100%,最大停留在0.9的位置,isDone永远为false,发送跳跃指令后才会完成。

工程与工程之间的资源迁移

导出,再导入

Export package,系统会自动选中所有关联资源

2017-05-03 23:46:31 avi9111 阅读数 764

一开始。。。。。一卡一顿的,人物很飘

public Vector3 TickMove(){
			float fThisMoveSpeed = EntityFSMMoveSpeed;
			Vector3 sThisSyncDir = EntityFSMDirection;
			if (m_pcGOSSI.fLastSyncSecond == 0) {
				m_pcGOSSI.fLastSyncSecond = Time.realtimeSinceStartup;
//				sThisSyncDir.z +=45;
			}
			float fSyncSecond = m_pcGOSSI.fLastSyncSecond;
			RealEntity.PlayerRunAnimation();
			Vector3 realPos2D = new Vector3(objTransform.position.x, 60, objTransform.position.z);


			//float fAngle = Vector3.Angle(sThisSyncDir, m_pcGOSSI.sLocalSyncDir);
			//位置计算
			float fThisRealTimeSinceStartup = Time.realtimeSinceStartup;
			//float fThisFrameTimeSpan = fThisRealTimeSinceStartup - m_pcGOSSI.fLastSyncSecond;
			float fThisFrameTimeSpan = fThisRealTimeSinceStartup - fSyncSecond;
			float fThisSyncDist = fThisMoveSpeed * fThisFrameTimeSpan;
	
			Vector3 sNewPos = sThisSyncDir * fThisSyncDist + realPos2D;
			if (sNewPos.magnitude > 0)
			{

				objTransform.position = sNewPos;
			}


			GameMethod.GetMainCamera.FixedUpdatePosition();
			m_pcGOSSI.fLastSyncSecond = fThisRealTimeSinceStartup;
			return sThisSyncDir;

		}


加了时间因子之后

双线程渲染

(一开始tickmove()方法放在某触发器下,发现并不均匀,现在放在LateUpdate事件里面即可,因为LateUpdate的时间因子是固定的,移动起来看上就不卡了)

例如:currentTime += Time.deltaTime; //这里的deltaTime是固定的


由于45度镜头,需要再调整方向夹角()

public void TickRotate(Vector3 sThisSyncDir){
			sThisSyncDir = 15 * sThisSyncDir;//乘大15并没有什么作用,暂时发现这句代码没用的,只是测试用	

			Quaternion DestQuaternion = Quaternion.LookRotation(sThisSyncDir);

			Quaternion sMidQuater = Quaternion.Lerp(objTransform.rotation, DestQuaternion, 3 * Time.deltaTime);//在from和to之间插值旋转.
			objTransform.rotation = sMidQuater;

		}


public Vector3 TickMove(){
			float fThisMoveSpeed = EntityFSMMoveSpeed;
			Vector3 sThisSyncDir = EntityFSMDirection;
			if (m_pcGOSSI.fLastSyncSecond == 0) {
				m_pcGOSSI.fLastSyncSecond = Time.realtimeSinceStartup;
//				sThisSyncDir.z +=45;
			}
			float fSyncSecond = m_pcGOSSI.fLastSyncSecond;
			RealEntity.PlayerRunAnimation();
			Vector3 realPos2D = new Vector3(objTransform.position.x, 60, objTransform.position.z);

			//Vector3 sThisSyncDir = realPos2D;
			//Vector3 sThisSyncDir = sCrossPoint - realPos2D;
			//sThisSyncDir.y = 0;
			//sThisSyncDir = this.ConvertVector3ToDir (sThisSyncDir);//转换角度
			//不使用单位向量,摇杆幅度越大,应该速度会越快
			sThisSyncDir.Normalize();
			sThisSyncDir = Quaternion.AngleAxis(-45, Vector3.up) * sThisSyncDir;

			//float fAngle = Vector3.Angle(sThisSyncDir, m_pcGOSSI.sLocalSyncDir);
			//位置计算
			float fThisRealTimeSinceStartup = Time.realtimeSinceStartup;
			//float fThisFrameTimeSpan = fThisRealTimeSinceStartup - m_pcGOSSI.fLastSyncSecond;
			float fThisFrameTimeSpan = fThisRealTimeSinceStartup - fSyncSecond;
			float fThisSyncDist = fThisMoveSpeed * fThisFrameTimeSpan;
	
			Vector3 sNewPos = sThisSyncDir * fThisSyncDist + realPos2D;
			if (sNewPos.magnitude > 0)
			{

				objTransform.position = sNewPos;
			}


			GameMethod.GetMainCamera.FixedUpdatePosition();
			m_pcGOSSI.fLastSyncSecond = fThisRealTimeSinceStartup;
			return sThisSyncDir;

		}



缺少打击感

对于mmoa,王者荣耀之流的游戏,重在操作流畅和技能准确性,以及服务器和网络的稳定,对实际镜头效果需求不大,一般的镜头即可

最终预计采用《武士2》的后摇镜头






参考资料:

北京unity3d创业团队,对技术有研究,VR,C#等。。。。不错的说

http://blog.csdn.net/sxbluebird/article/details/43225401

2019-01-22 19:33:49 ugfdfgg 阅读数 441
               

// Use this for initialization
 void Start ()
 {
   string path="";
   if(Application.platform==RuntimePlatform.Android)
   {
    path=Application.persistentDataPath;
   }
   else if(Application.platform==RuntimePlatform.WindowsPlayer)
   {
    path=Application.dataPath;
   }
   else if(Application.platform==RuntimePlatform.WindowsEditor)
   {
    path=Application.dataPath;
   }
  
   string configip=LoadFile(path,"test.txt");
   if(configip!="error")
   {
    gameObject.GetComponent<UILabel>().text="read:"+configip;
   }
   else
   {
    createORwriteConfigFile(path,"test.txt","192.168.200.252");
    string str=LoadFile(path,"test.txt");
    gameObject.GetComponent<UILabel>().text="create:"+str;
   }
 }
 /// <summary>
 /// 在指定位置创建文件   如果文件已经存在则追加文件内容
 /// </summary>
 /// <param name='path'>
 /// 路径
 /// </param>
 /// <param name='name'>
 /// 文件名
 /// </param>
 /// <param name='info'>
 /// 文件内容
 /// </param>
 private void createORwriteConfigFile(string path,string name,string info)
 {
   StreamWriter sw;          
   FileInfo t = new FileInfo(path+"//"+ name);          
   if(!t.Exists)          
   {            
    sw = t.CreateText();
   }          
   else      
   {
    sw = t.AppendText();         
   } 
   sw.WriteLine(info);
   sw.Close();
   sw.Dispose();
 }
 /// <summary>
 /// 删除文件
 /// </summary>
 /// <param name='path'>
 /// Path.
 /// </param>
 /// <param name='name'>
 /// Name.
 /// </param>
 void DeleteFile(string path,string name)
 {
   File.Delete(path+"//"+ name);
 } 
 /// <summary>
 /// 读取文件内容  仅读取第一行
 /// </summary>
 /// <param name='path'>
 /// Path.
 /// </param>
 /// <param name='name'>
 /// Name.
 /// </param>
private string LoadFile(string path,string name)   
{     
   FileInfo t = new FileInfo(path+"//"+ name);          
   if(!t.Exists)
   {
    return "error";
   }
   StreamReader sr =null;    
   sr = File.OpenText(path+"//"+ name);
       string line;    
  while ((line = sr.ReadLine()) != null)    
  {    
break;
  }
   sr.Close();
   sr.Dispose();
   return line;
}      


<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

2013-01-12 14:52:45 borsyu 阅读数 7084

    不得不说,unity3d是一个解放生产力的游戏引擎,自带了各种编辑器,可以进行一系列的可视化操作。

需要注意的是,unity3d适合FPS游戏,物理游戏等中小型的游戏,并不太适合MMO开发。

    从最开始接触unity3d,到了解大致内容,能上手开发,自己断断续续用了半个月时间。期间走了不少弯路,

总结了一下一个自己倒过头来觉得适合一些没有接触过unity3d的朋友的学习路线:


此过程假设学习者:

        1. 有一定图形学基础,比如清楚3D平移旋转等操作,四元数基本原理,对纹理,材质,灯光等有基本了解。

        2. 开发语言不是障碍,即采用何种语言进行开发不是问题。

        3. 阅读英文艺术文档没有障碍

对于1,如果是计算机专业毕业,一般找一本图形学的书籍看半天足够了。

对于2,unity3d支持C#,Javascript,Boo三种脚本语言开发,可以任选一种。

学习路线也可以根据实际情况任选。

学习路线1:

       1.  手册manual第一部分通读,并熟悉unity3d环境(半天)

       2.  通读手册脚本指南中的overview部分(半天)

       3.  官网的例子学习,3DPlatformTutorial(一周)


学习路线2:

       1. 手册manual第一部分通读,并熟悉unity3d环境(半天)

        2. 照书学,理论结合实例,如果基础稍弱,且想学想做的游戏有不少2D元素,可以采用《Unity 3.x Game Development beginner》一书,                  

        若基础稍好一点点,可以采用《Unity.3.x.Game.Development.Essentials》一书。PS:这2本书都有英文电子版可以下载。(一周)


OK,就这么简单,其实只要几天,就足够上手开发了。认真做完这几步,基本上已经能够应付大部分游戏开发内容了,剩下的就可以边做边熟悉了。


2015-03-31 11:59:54 Stephen167 阅读数 537

Unity3D中,NGUI中的UICamera为UI按钮提供了非常方便的触控接口,onClick , onDrag , onPress。

那3D场景中的物体是否可以简单的使用该方法?

可以。

在场景摄像机Main Camera上,添加组件UICamera。

然后在需要监听的物体上绑定下面脚本。


    void Start()
    {
        UIEventListener.Get(gameObject).onDrag = this.onDragEvent;
    }
    
    void onDragEvent(GameObject go, Vector2 delta)
    {
        Debug.Log(delta);
    }



记录Unity3D学习过程!

博文 来自: duanke111
没有更多推荐了,返回首页