admin 管理员组

文章数量: 887021

第六期

1,如何判断一个对象是否在摄像机视野范围内?

  1) 在Unity中有俩个方法是可以判断,OnBecameVisible 当可见和 OnBecameInvisible 当不可见两个无返回值的方法,      还有一个Renderer.isVisible布尔型的变量

      2)用物体映射到屏幕坐标来判断(和屏幕的宽和高比较) camera.WorldToScreenPoint(enemy.transform.position)        Screen.width Screen.height 如果映射后的坐标不在屏幕内,则出屏了

           
void Start(){  

Rect screenRect = new Rect(0, 0, Screen.width, Screen.Height);  

}  

void Update(){  

Vector3 screenPos = targetCamera.WorldToScreenPoint(objTrans.position);  

if(!screenRect.Contains(screenPos)){  

//do what you want  

Debug.log("Obj has gone out of screen..."); } }
 


2,Unity中隐藏鼠标指针的办法?

UnityEngine类,Cursor.lockState = CursorLockMode.Locked;是设置鼠标状态固定在中心,

Cursor.visible = false;鼠标是否可见




3,说说你了解的优化内存的方法

1,资源分离打包与加载,把多个对象使用的相同材质贴图字体等分离打包,这样不会重复实例一些资源,节省内存空间。资源分离打包与加载是最有效的减小安装包体积与运行时内存占用的手段。细致一点的抽离效果很明显。
2,整理图集,有效的减小合并DrawCall,在图片资源上,尽量使用9宫格切图方式用一些小图拉伸,顶点虽然多了只要DrawCall安排合理就好了
3,一些静态物体可以烘培使用假的- - 影子贴图。。。在手游方面主角动态的影子也不要使用Unity自带的实时投射那个方式 - - 上网上查阅一些方法合理的做出效果。

4, 内存池的使用



4,Unity中有几种灯光?每种灯光的用法举一个例子

Spot                        聚光,一般用作手电筒、车灯、剧幕舞台灯等

Directional               方向光, 一般用作模拟太阳光 Point                        点光, 一般用作灯泡、武器发光、爆炸效果等 Area (baked only ) 区域光, 只用做烘焙      

5,Unity触屏控制的相关函数是什么?(点击和滑动)
判断触摸数量为单点触摸:if(Input.touchCount == 1)      判断触摸类型为移动触摸:if(Input.GetTouch(0).phase==TouchPhase.Moved)   判断前两只手指触摸类型都为移动触摸: if(Input.GetTouch(0).phase==TouchPhase.Moved¦¦Input.GetTouch(1).phase==TouchPhase.Moved) 以此类推

6,如何在人物模型头顶显示血条?

主要的思路点就是,世界坐标到屏幕坐标的转换而已

  /// <summary>/// 将3D坐标位置转换为屏幕2D坐标位置/// </summary>/// <param name="entity">传入的3D物体</param>/// <returns></returns>private Vector3 getScreenPosition(GameObject entity){var worldPosition = entity.transform.position + mFloatOffset;var screenPosition = mCombatCamera.WorldToScreenPoint(worldPosition) / mCanvas.scaleFactor;return screenPosition;}         
}

血条代码
[C#]  纯文本查看  复制代码
using UnityEngine;
using System.Collections;public class BloodBarManager : MonoBehaviour {//绿色血条前景图public RectTransform ForeGround;//怪物血量,可外部调整public float MonsterHp = 1000f;//当前怪物血量public float CurMonsterHp = 1000f;//自定义的实际血条长度private const float totalLength = 62f;public void DoHit(float hit){if(hit < CurMonsterHp){var percent = hit / MonsterHp;var hitvalue = percent * totalLength;ForeGround.offsetMax = new Vector2(ForeGround.offsetMax.x - hitvalue, ForeGround.offsetMax.y);CurMonsterHp -= hit;}}
}
  

7,如何加载新场景?
   SceneManager.LoadScene("scenename");


 8,C#中委托的用法是?

      1、声明委托类型2、必须有一个方法包含了要执行的代码3、必须创建一个委托实例4、必须调用这个委托实例
  


void Start(){ Rect screenRect = new Rect(0, 0, Screen.width, Screen.Height); } void Update(){ Vector3 screenPos = targetCamera.WorldToScreenPoint(objTrans.position); if(!screenRect.Contains(screenPos)){ //do what you want Debug.log("Obj has gone out of screen..."); } }

本文标签: 第六期