Babybus-u3d技术交流-行星宝宝项目技术分享
[天文]值得借鉴的地方
一、程序结构
1.行星场景和真实星球场景依托于一个场景,然后根据一个标识符的不同,加载自己特殊的部分;
2.行星场景测试:通过标识符不同,加载不同的星球,所有行星独特的部分,均通过行星的script组件加载;所以在测试星球只要拖入行星,有新的物体加载,都依托在行星的script上,保证场景的复用性,也保证了两边场景[真实加载的场景和测试的场景]的对应性
3.利用字典类,将美工给的较杂乱的命名在程序规范化[尽量两边规范统一命名]
二、具体程序执行部分
1.//New Camera.rect (左下角位置,大小) 可以调节摄像机在视口上的位置和大小,可制作窗口振动,小地图等效果
2.//New 场景中的物体一旦销毁 想显示就需要重新通过prefab创建[考虑最好一直用prefab创建]
3.//New 持续触发响应函数 三维计算[龙卷风的范围]C#
void OnTriggerStay(Collider collider){
if(collider.transform.tag == "MarsDust"){
Vector3 center = new Vector3(transform.position.x,collider.transform.position.y,transform.position.z);
Vector3 cube = collider.transform.position;
Vector3 n = cube - center;
Vector3 v = Vector3.Cross (n,Vector3.up).normalized;
v = v + Vector3.up * v_up - n * v_in;
collider.constantForce.force = v * v_main;
}
}
4.hit = Physics.RaycastAll(ray);//New 获得所有的碰撞器
5.//New 限制向量的长度 可用来控制物体在距离初始位置固定范围内移动
Vector3 p = Vector3.ClampMagnitude(transform.position-OriginPos,4f);
6.//New 最后一个参数意味着所差值到的范围[0,1] Time.deltaTime代表上一帧花的时间此时实现的是弹簧效果[远快近慢但V*Time.deltaTime一般永远<1]
Vector3 p = Vector3.Lerp(obj.position,target,v*Time.deltaTime);//New MoveTowards与lerp相似,但是速度有限制transform.position=Vector3.MoveTowards (transform.position,oldPosition,2.0f);7.//New [回调函数]当激活时被调用
void OnEnable(){
}
8.StopAllCoroutines();//New 强制停止协程执行另·关于协程:使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。9.static的单例(singleton)在场景切换时也不会被摧毁,如果这种单例含有大量的对资源的引用,也会成为大问题10.Resources.UnloadUnusedAssets ();//New 卸载不使用的资源
11.audio.Play ();//New 声音只有加载到组件上 才可以发出声音
12.//New [SerializeField] 私有变量强制序列化后可以显示到属性表中
[SerializeField]private GameObject QiQi;
13.//New enabled用来关闭组件 SetActive()用来停用GameObject
//14.//New CrossFade 淡入淡出 CrossFadeQueued淡入淡出队列
animation.CrossFade(AnimStr.ValueForKey("Shui_Shibai"));animation.CrossFadeQueued(AnimStr.ValueForKey("Shui_Daiji"),0.02f,QueueMode.CompleteOthers);
//15.//New 判断平台:Application.platform == RuntimePlatform.WindowsPlayer\16.//New animation.normalizedTime可以用来判断动画结束或快进动画
animation[animationName].normalizedTime<0.9f;
//17.//New ForceMode可以根据力的模式对物体施加力
rigidbody.AddForce(5.0f,ForceMode.Impulse);
//18.//New UICamera.IsPressedUI可用于持续持续按住的效果
if (UICamera.IsPressedUI())
{
if (UICamera.GetTouch(0).pressed == ScaleDownBtn) {//一直按的按钮
ScaleDown(true);
}
}
//8.13增:来自UIcamera.cs
static public bool IsPressed (GameObject go)//系统自带
{
for (int i = 0; i < 3; ++i) if (mMouse[i].pressed == go) return true;
foreach (KeyValuePair touch in mTouches) if (touch.Value.pressed == go) return true;
if (controller.pressed == go) return true;
return false;
}
static public bool IsPressedUI ()//自己写的
{
foreach (KeyValuePair touch in mTouches) {
if(touch.Value.pressed == null) return false;
if (touch.Value.pressed.layer == 10) return true;
}
return false;
}
19.//New 绕轴旋转 最后参数是速度
transform.RotateAround(Vector3.zero, Vector3.up, spinspeed * SpaceSceneManager..Timespeed * Time.deltaTime);
20.关于animator动画控制器[
[http://game.ceeger.com/Manual/AnimationParameters.html
[http://game.ceeger.com/Components/class-AnimatorController.html
控制动作协调
cj.transform.FindChild ("Uranus_sc").GetComponent().enabled = true;
if(Isfirsttime)
{
ani.SetBool ("kai",true);
Isfirsttime = false;
}
else
{
ani.SetBool ("guan",false);
ani.SetBool ("guanhoukai",true);
}
21.SetActive()[http://game.ceeger.com/Manual/UpgradeGuide3540.html
void unableallchid(Transform tra)
{
for(int i=0;i<tra.childcount;i++)< div="">{
tra.GetChild(i).gameObject.SetActive(false);
}
}
//22.关于转换。将物体转换成抽象大小。
if(ID == 1)
{
times = transform.position.x/objdis_P;//转换为个
leftsidetimes = (int)times;
if(transform.position.x<0)
{
leftsidetimes -= 1;
}
leftsidepos = leftsidetimes * objdis_P;
rightsidetimes = leftsidetimes+1;//距离左边一个和右边一个的距离
rightsidepos = rightsidetimes * objdis_P;
}
tarpos = ((transform.position.x - leftsidepos) < (rightsidepos - transform.position.x))?newVector3(leftsidepos,transform.position.y,transform.position.z):
new Vector3(rightsidepos,transform.position.y,transform.position.z);
//23.UIButton 通过点击动态变化图标
HDBtn.GetComponent().normalSprite = "2A";
//24animation.speed
//New1 speed<0动画可以回放
Leaf.animation ["leaf"].speed = -0.3f;
//设置石头的位置
void SetJewel(){
Random.seed = (int)Time.time;
float dis = CarArea.localScale.y / (Jewel.Length+1)-0.1f;
for(int i = 0; i<jewel.length;i++){< div="">Jewel[i].gameObject.SetActive(true);
Vector3 dir = new Vector3(Random.Range(-1f,1f),-0.01f,Random.Range(-1f,1f));
dir.Normalize();
//New 在一个个圆弧上随机放置
Jewel[i].position = dir*dis*i+CarArea.position+Vector3.up*0.1f;
}
}
//26.
//New 在世界坐标移动
BG[i].Translate(-(Vector3.up * slideParameter), Space.World);
//Space.Self是基于物体自身局部坐标的[默认]
//27.
//New 此时特效是UI坐标 转换3维世界的位置到UI世界的位置需要通过Screen坐标
Vector3 ScreenPos = Camera.main.WorldToScreenPoint(other.transform.position);
Vector3 UIPos = GameObject.Find("UICamera").GetComponent().ScreenToWorldPoint(ScreenPos);
//28.//New Find搜索当前场景,效率并不高。建议FindWithTag[
[http://bbs.9ria.com/thread-156938-1-1.html
WeiLang = GameObject.Find ("WeiLang").GetComponent();
//29.查看系统自带Manual脚本,参考,用户手册
//可重用的代码
//New 手势放大缩小判断
public bool isEnlarge(Vector2 oP1, Vector2 oP2,Vector2 nP1,Vector2 nP2){
//函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势float leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y));
float leng2 =Mathf.Sqrt((nP1.x-nP2.x)*(nP1.x-nP2.x)+(nP1.y-nP2.y)*(nP1.y-nP2.y));
if(leng1<leng2)
{//放大手势return true; }else{//缩小手势return false; } }
//New 移动摄像机到某一位置
void MoveTopos(Transform tra)
{float i = 0.0f;
while (true)
{ Vector3 sourcePos = Camera.main.transform.position;
Vector3 sourceRo = Camera.main.transform.eulerAngles;
Vector3 destPos = tra.position;
Vector3 destRo = tra.eulerAngles;
Camera.main.transform.position = Vector3.Lerp(sourcePos, destPos, Mathf.SmoothStep(0,1,i));
Camera.main.transform.eulerAngles = Vector3.Lerp(sourceRo, destRo, Mathf.SmoothStep(0,1,i));
i += Time.deltaTime/5.0f;if(Vector3.Distance(sourcePos, destPos<0.1f&&Vector3.Distance(sourceRo, destRo)<0.1f)
{
if(tra.name == "camerapoint02")
{
canmoveto03 = true;
}
break;
}return 0;
}
}
//是否点击到某一物体
bool isTouched(Transform obj)
{
if (Input.touchCount == 1)
{
Ray ray = Camera.main.ScreenPointToRay (Input.GetTouch (0).position);RaycastHit hit;if (Input.GetTouch (0).phase == TouchPhase.Began)
{
if (Physics.Raycast (ray, out hit)) {if (hit.transform.name == obj.name)
{
return true;
}
}
}
return false;
}
//触屏操作
if(Input.touchCount == 1
{
TouchPhase phase = Input.GetTouch(0).phase;
Touch touch = Input.Get Touch(0);//射线 Ray ray = Camera.main.ScreenPointToRay (Input.GetTouch (0).position); RaycastHit hit;switch(phase){
{ case TouchPhase.Began:if (Physics.Raycast (ray, out hit)) {