行星宝宝项目技术分享

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)) {
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,570评论 25 707
  • 跟一位熟识的阿姨聊天,阿姨说前阵子老伴生病住院。 在医院里,每到护士过来让叔叔服药的时候老人就像个孩子似得要求吃完...
    沙栗阅读 488评论 0 1
  • 今天是2017年11月2日, 距2018年还有59天, 饱览群书无数,历经实践甜苦。 早安️
    猪娘娘阅读 507评论 0 0