NGUI之UIGrid自适应屏幕

今天做项目遇到了一个很无奈的事. 在使用NGUI做Scroll View功能时我在Scroll View下面使用了UIGrid进行排列拖动项.

但是最后发现UIGrid居然不可以设置锚点.每个可拖动项也不可以设置锚点,因为即使加了脚本后可以设置也会出现问题,运行后拖动选择项会出现抖动现象,因为他们是有锚点的会根据位置调整一下,出现抖动的反应.

后来我发现虽然不可以在UIGrid上设置锚点但是可以控制UIGrid上Transform的大小这样里面的选择项也会跟着放大和缩小了.找到方法后我开始想怎么实现它最好.然后我找到了UIStretch这个脚本,可根据设置改变对象的大小.但上面的设置选项并没有符合我要求的选项.索性我就自己加了一条.

//首先在脚本的前面加入一个选择项
public enum Style
	{
		None,
		Horizontal,
		Vertical,
		Both,
		BasedOnHeight,
                BasedOnWidth,//fgreen加入的代码;
		FillKeepingRatio, 
		FitInternalKeepingRatio 
	}

//然后在UPDATE里面加入if判断根据自己设置的默认宽高进行比例缩放
  if (style == Style.BasedOnHeight)
  {
   size.x = relativeSize.x * rectHeight;
   size.y = relativeSize.y * rectHeight;
  }
 else if (style == Style.BasedOnWidth)//fgreen加入的代码
 {
    size.x = relativeSize.x * Screen.height/854;//我项目中设置默认的是854的高和480的宽;
    size.y = relativeSize.y * Screen.width/480;//当屏幕宽带大于或小于它们时求它们的除数;
    size.z = size.x;
 }


 

 

Unity3D 5.0 刚体API更改

刚才做项目时发现一个问题,在Unity5.0 以后的版本中 不可以直接对物体引用刚体的API如

hit.rigidbody.AddForce此用法在5.0以后已经不可以使用了而取而代之的是 使用

hit.GetComponent<Rigidbody>().AddForce来代替它.

相同的其他刚体API也是这样的,如发现其他函数的调用有问题也可以试试先获取组件再调用哦.

 

Unity3D—UGUI学习

最近学习了一下unity3D自带的UGUI发现他和NGUI是差不多的所以学起来是很快的,基本上NGUI上有的功能在UGUI上都可以实现吧.

就像NGUI的所有的组件都是在UIROOT下的,而在UGUI中的UI组件是需要在Canvas下的.否则是看不见他们的.在UIroot中是有一个相机的组件的然后专门用来渲染UI组件的可以调整相机的属性达到不同的效果,而在UGUI中却没有这么一个相机组件,但是它可以在Canvas的RenderMode属性中设置渲染的方式,达到UI的显示方式,比如使UI贴在屏幕中不动或跟着摄像机移动或者是转换成3D视角方式显示UI.

不同的是 在NGUI中UIROOT只能有一个,而UGUI中的Canvas可以有多个并不限制.

两者的按钮响应事件的添加方式是类似的,都是直接拖动物体到OnClick属性中,然后选择对应的函数.

而在NGUI中某些事件的响应可以通过添加它自带的脚本实现,但是在UGUI中是通过在自己创建的脚本中继承某些接口然后实现它的函数来达到效果的.

比如在UGUI中通过继承IBeginDragHandler,IEndDragHandler,IDragHandler,IPointerEnterHandler等接口来实现鼠标的拖拽功能,和鼠标的移入移出等事件的捕获.然后实现如下函数.

Unity3D之局域网CS对战(第五天笔记)

今天主要学习了角色在局域网中的控制,怎样把角色同步到其他客户端然后各自控制自己的角色互不影响.使用RPC调用角色控制.

需要注意的是:

1. // go.GetComponent<Player>().SetOwnerPlayer(Network.player);//这个代码只设置了当前创建者中的战士的ownerPlayer属性在其他客户端这个属性是空的;

2. go.networkView.RPC(“SetOwnerPlayer”, RPCMode.AllBuffered, Network.player);//远程调用;使用这个远程调用

在 SetOwnerPlayer方法上面必须声明是[RPC];否则会出错.如下:

[RPC]//使用注解表示这个方法是一个远程调用;
public void SetOwnerPlayer(NetworkPlayer player)
{
this.ownerPlayer = player;
if (Network.player!=this.ownerPlayer)
{
LoseControl();

Debug.Log(“失去控制”);
}
}

3.需要同步的数据都需要使用RPC远程调用实现.

4.在需要获取同步角色中自身组件的函数中一定要把函数放在RPC远程调用函数中执行才有用这样执行的才是调用自身的那个.

如:需要在每个角色中获取

motor=this.GetComponent<CharacterMotor>();

则需要把motor=this.GetComponent<CharacterMotor>();放在 SetOwnerPlayer函数里面调用才行.

 

今天最终的效果还是没有调试出来,不知道是我的原因还是版本的原因,反正客户端和服务器端的动画还无法同步出来死亡伤害也无法实现,

只能明天再调试一下了.

Unity3D之局域网CS对战(第二天笔记)

今天学习了第一人称视野的控制和添加动画,原来实际上的动画就是控制骨骼的运动.所以当你挂载物体时如果要在动画中体现出来那么你就要挂载到相应的骨骼位置下,这样动画动起来你挂载的物体才能跟着动.比如说摄像机想要跟随头部的运动那么你就要挂载到相应的头部骨骼下才行.

学习中有以下几个重点:

1.

animation.Play(animName);//立即停止当前动画播放animName动画;
animation.CrossFade(animName, 0.2f);//有0.2秒的缓冲时间然后渐变为animName动画;

2.

LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。

之前看视频的时候发现视频里面siki老师讲的他是可以在当mouseLook脚本里面控制骨骼的旋转的,我自己放到我的项目里面发现确不行后面一节视频才讲到原来就是LateUpadate和Update先后调用问题,因为模型的动画是在每一帧都会调用的就相当于Update而对骨骼的旋转如果再放在Update里面就得不到相应的改变,只能放在LateUpate里面当动画执行后再去执行鼠标对模型骨骼的旋转.

3.

float h=Input.GetAxis(“Horizontal”);//获取键盘的左右方向输入;
float v=Input.GetAxis(“Vertical”);//获取键盘的上下方向输入;

 

 

Unity3D之局域网CS对战(第一天笔记)

今天准备开始学习一下Unity3D网络游戏的开发了,刚好在泰克在线上看到了这个CS的局域网对战项目,正好符合我的口味,准备一天看个一章应该没问题关键是总共才3章估计3天也就看完了也跟着做完了哈哈.

今天主要了解了以下几点:

1.Unity3D的网络组件—-network,它实际上是一个类

Network类是网络实现的核心并提供核心函数。

2.利用 Network.InitializeServer进行初始化一个服务器,它需要3个参数,最大连接数,端口号,是否NAT地址转换.

3.给需要同步的物体加上 network view组件,此组件用来在局域网之内去同步一个游戏物体的组件,但是它会把创建他的作为它的主人,同步到其他客户端,它自己本身不会被其他客户端同步.

4.客户端连接使用Network.Connect(ip, listenPort);其中IP则是IP地址,而listenPort则是服务器端创建的端口号.

5.第一称里面的Mouse Look.cs脚本是鼠标控制角色的视角的脚本,而其他的脚本是控制角色的移动的.

6.Input.GetAxis(“Mouse X”)可以获取鼠标或键盘的输入然后对角色进行控制,

如.Input.GetAxis(“Mouse X”)就是获取鼠标左右方向的移动,而 Input.GetAxis(“Horizontal”);是获取键盘左右方向的移动.

unity3d的3种交互

1.角色碰撞交互

//检测角色碰撞函数
function OnControllerColliderHit(hit:ControllerColliderHit)

2.光线投射交互

//光线投射函数

Physics.Raycast(transform.position,transform.forward,hit,2)

3.触发器交互

先添加触发器(当触发器是触发模式时角色碰撞没有用)

//触发器函数

function OnTriggerEnter(col:Collider)