unity3d 2018.3f5 干货教程基础命令方法

安装及配置贴

http://blog.csdn.net/lengyoumo/article/details/78723142

####本帖脚本文件使用c#语言

###在脚本中获取当前脚本绑定的对象

transform为当前绑定的对象
例:
transform.Translate(positionX, positionY, positionZ);

###在脚本中获取目标对象

GameObject是获取对象的方法。GetComponent用来获取属性是泛型,指定属性的名称。

例1:
GameObject.Find(“ts”).GetComponent().text=“哈哈”;
例2:
Transform n= Instantiate(newObject,position,routation)
n.GetComponent().AddForce(fwd*2800);

###脚本控制gui文字

首先必须引入头文件
using UnityEngine.UI;

例:

GameObject.Find(“objectname”).GetComponent().text=“哈哈”;

###编写输入控制简本
按键

检测如果按下了按键"Q"就触发事件
if(Input.GetKey(KeyCode.Q)){
transform.Rotate(0,1,0);
}

鼠标左键按键

if(Input.GetButtonDown(“Fire1”)){
transform.Rotate(0,1,0);
}
if(Input.GetMouseButtonDown(0)){
}

根据asdf 上下左右触发事件

// 获取{-1,1}的范围判定按键方向 asdw 上下左右,数值会随按压时间增长{-1,1}
//获取垂直 水平数据
float h = Input.GetAxis(“Horizontal”);
float v = Input.GetAxis(“Vertical”);
// 为物体加力
rd.GetComponent().AddForce(new Vector3(h,0,v)*moveSpeed);

###对象生成器

创建新对象
public Transform newObject;
在当前脚本绑定的对象的位置和角度创建一个新的对象n
Transform n= Instantiate(newObject,transform.position,transform.rotation);
新建的物体赋予新的属性
Vector3 fwd =transform.TransformDirection(Vector3.forward);
n.GetComponent().AddForce(fwd*2800);
###对象销毁

3秒后删除当前对象
void Start () {
Destroy(gameObject,3);
}

###测试方法

Debug.Log(object)

###Gameobject ,gameObject,Transform,transform的区别和关联

Gameobject是一个类型,所有的游戏物件都是这个类型的对象。通过这个对象可以控制其他物体和属性。
gameobject是一个对象, 就跟java里面的this一样, 指的是这个脚本所附着的物体。
-
Transform是一个类,用来描述物体的位置,大小,旋转等等信息。
transform是Transform类的对象,依附于每一个物体。也是当前脚本绑定的组件
-
transform : 当前游戏对象的transform组件
gameobject :当前游戏对象的实例
-
gameobject.find用来获取场景中我们需要查找的对象(object)。而transform.find方法则是获取当前对象的子对象下我们需要获取的目标对象位置信息

gameobject.transform与transform.gameobject
gameobject.transform,是获取当前游戏对象的transform组件.
所以在start函数中 gameobject.transform 和this.transform,指向的都是同一个对象。即:gameobject.transform == this.transform == transform
* transform.gameobject:可以这么理解为:获取当前transform组件所在的gameobect
所以在start函数中()transform.gameobject == this.gameobject == gameobect
该部分转自网友的帖子
http://blog.csdn.net/lxl_815520/article/details/53638481

###菜单控制命令

退出
Application.Quit();
重新读取场景01
using sceneManager=UnityEngine.SceneManagement;
sceneManager.SceneManager.LoadScene(“01”);

###碰撞检测
碰撞检测的特点是一旦触发碰撞主角与被碰撞物体都会受到物理影响
碰撞检测有三个会自动触发的过程方法

OnCollisionEnter(Collision collision)//开始碰撞
OnCollisionExit()//结束碰撞
//碰撞持续中

碰撞检测 是物理引擎Rigidbody中的api
在主角脚本中 加入 碰撞自动触发方法
void OnCollisionEnter(Collision collision){
// collision.collider 获取碰撞到的游戏物体身上的Colliser组件
// string name =collision.collider.name;//获取碰撞到的物体名字
如果碰撞的 标签符合条件则删除
if(collision.collider.tag==“food 1” ){
Destroy(collision.collider.gameObject);
}
}

###触发检测
触发检测与碰撞检测的区别是,由于碰撞双方其中一方取消了碰撞区域,所以碰撞后双方都没有受物理影响。

触发检测也有三个自触发方法
OnTriggerEnter(Collider collider)//开始触发
OnTriggerExit()//结束触发

1,首先选定受力物体 属性 中的 "is trigger"选项。使其不受物理影响
2,void OnTriggerEnter(Collider collider){
if(collider.tag==“food” ){
Destroy(collider.gameObject);
}
}

###射线检测
射线检测是从指定位置发射光线,光线触碰的第一个物体或是穿过的所有问题会产生反馈

###鼠标光标设置
设置 Cursor.lockState 可以设置鼠标光标限制

//无任何限制
 Cursor.lockState=CursorLockMode.None;
//将光标锁定在屏幕中央
Cursor.lockState = CursorLockMode.Locked;
//将光标限制在游戏窗口内
Cursor.lockState = CursorLockMode.Locked;

是否显示光标
Cursor.lockState = true;
官方鼠标api
https://docs.unity3d.com/ScriptReference/30_search.html?q=cursor

###GUI 按钮方法
五种添加按钮的方法
0,

1,在画布中创建ui butoon
2,创建脚本 mybutton   并将其拖到ui button上
脚本内容:
void Start () {
	gameObject.GetComponent<Button>().onClick.AddListener(OnClick);
	}
void OnClick(){
	Debut.Log("u click button")
}

1,直接添加按钮

1在画布中直接创建UI Button
2创建一个脚本 mybutton
添加一个公有属性和 一个公有的自定义方法
using UnityEngine.UI;
public Button btn;
public void ButtonAct(){
Debut.Log(“hahaha?”);
}
3,将该脚本绑定到画布里
4,将之前创建的按钮控件拖拽到 canvas画布里的 btn属性。就是将按钮绑定到画布。
5,把画布绑定到按钮里。点击button控件,在下面的onclick属性 中 选择脚本挂载的物体。就是canvas。然后 选择刚才新建的方法 ButtonAct()

2,脚本生成按钮

在脚本中添加一个方法 void OnGUI(){
rect中的参数为横座标纵座标长和宽
if(GUI.Button(new Rect(80,80,100,60),“按钮1”)){
print(“点击了该按钮”);
}
}

3.脚本带贴图的按钮

1在脚本中添加一个方法 void OnGUI(){
rect中的参数为横座标纵座标长和宽
if(GUI.Button(new Rect(80,80,100,60),texture)){
print(“点击了有图标的按钮”);
}
}
2.mybutton脚本中有了textrue属性,然后把贴图拖过去即可。

3.脚本带style的按钮(高自定义)

1 添加公共属性 GUIStyle.style;
2在脚本中添加一个方法 void OnGUI(){
rect中的参数为横座标纵座标长和宽
if(GUI.Button(new Rect(80,80,100,60),“按钮x”,style)){
print(“点击了有style的按钮”);
}
}
3.mybutton脚本中有了tstyle系列的属性,按需设置即可。

按钮绑定

https://www.cnblogs.com/isayes/p/6370168.html

###GUI label 控件
也是三种方式

void OnGUI(){
{
1,
GUI.Label(new Rect(100,100,80,60),“这是一个文字标签”);
2,
using unityEngine.UI
public Texture texture;
GUI.Label(new Rect(100,100,80,60),texture);
3,
public GUIContent content
GUI.Label(new Rect(100,100,80,60),content);
}
###GUI textField控件
两种方法
1直接用控件
直接在project中create InputFeld

2代码创建

public string str="请输入文本"; void OnGUI(){ str=GUI.TextField(new Rect(100,400,200,100),str) }
###Image,RawImag控件
两个组件的区别,Image是精灵图片。RawImag可以添加纹理图片。

###ui 布局

2,给空物体添加组件layout中的一种布局方式
3,在空物体下新建物体,重复的添加之后就会自动对齐

###UI自适应窗口尺寸

Canvas 的 Inspector 中设置 Canvas Scaler (Script) 的 UI Scale Mode 为 Scale With Screen Size。
填写 Reference Resolution 的 XY 为你想要的屏幕尺寸。
Canvas 的 Inspector 中设置 Render Mode 为 Screen Space - Camera,Render Camera 为 Main Camera(场景主相机)

##使用ui事件

这时点击 eventSystem 再点击运行游戏,就能在右面的属性面板看到当前鼠标与ui交互的信息了
2,写一个脚本 在脚本中 的类下 继承IPointerDownHandller接口 (然后按提示添加using)
添加 public void OnPointerDown(){
	print("你按了按钮")
}
3,把脚本绑定到按钮上。

###使物体移动的两种方法
1.直接修改物体座标

//walkSpeed= +-number
//前后移动
transform.Translate(Vector3.forward  * Time.deltaTime* walkSpeed);  
transform.Translate(Vector3.forward * Time.deltaTime * -walkSpeed ); 
//左右移动
transform.Translate(Vector3.left * Time.deltaTime * walkSpeed );  
transform.Translate(Vector3.left * Time.deltaTime * -walkSpeed );  

2通过刚体属性施加作用力

//walkSpeed= +-number
//前后重力移动
gameObject.GetComponent<Rigidbody>().AddForce(transform.forward*walkSpeed);
//gameObject.GetComponent<Rigidbody>().AddForce(transform.forward*-walkSpeed);	
//左右重力移动
//gameObject.GetComponent<Rigidbody>().AddForce(transform.right*-walkSpeed);
//gameObject.GetComponent<Rigidbody>().AddForce(transform.right*walkSpeed);

###在脚本中获取物体的方法
1,获取脚本绑定的物体

1 将脚本拖拽到物体上 即完成脚本与物体绑定。
2,在脚本中 直接调用gameObject就是当前绑定的物体
直接调用transform 是当前绑定物体的位置方向大小等信息。

2,获取指定名称的物体

在任意脚本中 调用GameObject.Find("物体名")即可获取该物体
调用GameObject.Find("物体名").GetComponent<属性名>();即可获取该物体的属性;

3,获取 物体绑定的属性中指定的物体

1,首先创建脚本 并与某个物体绑定。
2,在脚本中创建公共属性 pulic GameObject gameobj;
3,此时脚本绑定物体的属性栏中出现了gameobj属性,将另一个要绑定的物体拖过来即可
在脚本中直接调用gameobj即可.

###prefab预置体
######动态加载prefab

1,prefab必须放置在 assets-Resources->prefabs中。 注意这个Resources
2,实例化
GameObject targetObject = (GameObject)Resources.Load("Prefabs/Switch");
3,实体化,newObj就是实体化后的对象。
	GameObject newObj=Instantiate(targetObject);
4,指定对象的位置
newObj.transform.parent =GameObject.Find("Canvas").transform;	

#####批量修改prefab物体
修改一个prefab生成的物体,然后再属性中选择apply 即可同步到所有的物体。

###一个元素工厂 产生器
自动复制生成指定的物体。

1,创建一个物体,作为产生器。
2,编写一个脚本并绑定到产生器。
//要复制的源物体
public GameObject generateGameObjReource;
void Update () {
	//创建新物体,参数是物体源,位置,方向。
	  GameObject newGameObj=Instantiate(generateGameObjReource,new Vector3(1,1,1),new Quaternion(0,0,0,0));
}
3,将要生成的物体绑定到产生器的脚本属性 enerateGameObjResource

###创建对象

//创建3d对象类型
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
//添加刚体属性                cube.AddComponent<Rigidbody>();
//设置位置                    
cube.transform.position = new Vector3(x, y, 0);

调整大小
````newGameObj.transform.localScale=new Vector3(20f,15f,1);```

###动画 animation animator
点击物体->window->animation -create cure 即可创建一个动画。为物体创建动画会自动申城一个animation controller ,就是animator。
animation是动画主体,animator是控制动画播放,顺序的。
###按条件控制动画播放
1在animator窗口左上角 点击parameter,即可创建变量,这里选int类型。
2然后再右面entry下面 新建一个state 使entry连接state,state再连接动画state。在该state中inspector 点击conditions 即可选择新建的变量。此处可以设置等于大于或小于4中条件判断。
3最后 哎playmaker或脚本中 设置该变量等于指定的数值 ,即可开启该state 跳至动画播放。

unity Navigation 自动寻路

1,创建地形plan,障碍物,主角。
2,点击地形->window->Navigation,勾选Navigation static。然后点击bake 即可出地形。
3,为主角添加 Navigation组件
4,为主角添加脚本
private NavMeshAgent navAgent;
	// Use this for initialization
	void Start () {		navAgent=gameObject.GetComponent<NavMeshAgent>();
	}	
	// Update is called once per frame
	void Update () {
		navAgent.SetDestination(new Vector3(0,0,20));
	}

即可成功触发。寻路





###故障&问题
please set the bundle identifier in

android平台导出问题。在buildsetting 中选player setting,然后再 othersetting 中修改公司的名字即可
com.componyname.objname

#2d游戏
###初始设置
1,摄像机设置成正交相机。
2,在屏幕中position z轴决定元素前后顺序

###建立sprite动画
1,在桌面创建精灵。新创建的精灵可能会过小需要放大。
2,window->animation 打开动作编辑器
3,点击刚才添加的精灵,这时animation编辑器中 create就可以按了
4,点击create 创建动画文件
5,点击左面的add property按钮->sprite render -> 后面的加号。 这样就新建了一条时间线。
6,将图片或图片组 拖拽到时间线即可。
点击时间线的下箭头可在时间线预览图片
7,直接关闭即可保存
创建精灵时最好直接做成prefab ,如果没有,做好动画后直接拖拽到精灵元素上也行。

###时间 Time

1/ Time.time 表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算。

2/ Time.timeSinceLevelLoad 表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止。

3/ Time.deltaTime 表示从上一帧到当前帧时间,以秒为单位。

//计时器通过这个使用,update里把Time.deltaTime累加起来,就是经过的时间
4/ Time.fixedTime表示以秒计游戏开始的时间,固定时间以定期间隔更新(相当于fixedDeltaTime)直到达到time属性。

5/ Time.fixedDeltaTime 表示以秒计间隔,在物理和其他固定帧率进行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行设置。

6/ Time.SmoothDeltaTime 表示一个平稳的deltaTime,根据前 
N帧的时间加权平均的值。

7/ Time.timeScale 时间缩放,默认值为1,若设置<1,表示时间减慢,若设置>1,表示时间加快,可以用来加速和减速游戏,非常有用。

8/ Time.frameCount 总帧数

9/ Time.realtimeSinceStartup 表示自游戏开始后的总时间,即使暂停也会不断的增加。

10/ Time.captureFramerate 表示设置每秒的帧率,然后不考虑真实时间。

11/ Time.unscaledDeltaTime 不考虑timescale时候与deltaTime相同,若timescale被设置,则无效。

12/ Time.unscaledTime 不考虑timescale时候与time相同,若timescale被设置,则无效。
From: http://blog.csdn.net/liuyang_sy/article/details/46811125 

###调试&测试
#####android真机测试配置

1,打开手机端开发者选项,打开usb调试,并将手机连接到电脑

2,在player setting 中 的other stting 中勾选 enable internal profiler

3,building setting中勾选 development build和auto connect profiler

4,运行 build and run
手机端就会弹出安装信息。

###手机屏幕翻转
#####禁止手机屏幕翻转

1.通过设置
Plyer Setting 中设置 Deafult Orientation 为 portrait。
2.通过代码(代码决定权更高)
Screen.orientation = ScreenOrientation.AutoRotation;  
        /// 是否可以翻转到某个方向
        Screen.autorotateToLandscapeLeft = true;  
        Screen.autorotateToLandscapeRight = true;  
        Screen.autorotateToPortrait = true;  
        Screen.autorotateToPortraitUpsideDown = true;  

#####限定手机翻转方向

void Start()  
{  
	//设置屏幕正方向在Home键右边  
    //Screen.orientation = ScreenOrientation.LandscapeRight; 
    //设置屏幕自动旋转, 并置支持的方向  
    Screen.orientation = ScreenOrientation.AutoRotation;  
    Screen.autorotateToLandscapeLeft = true;  
    Screen.autorotateToLandscapeRight = false;  
    Screen.autorotateToPortrait = false;  
    Screen.autorotateToPortraitUpsideDown = false;  
}  

###生命周期
(借用一张图,原文地址在水印上:)
这里写图片描述

需要特别说明的是OnEnable  是每次暂停后,重新开始也会执行一次的生命状态。

脚本无法跟随物体独立的问题

就是说同一个脚本,放置在不同的物体上,他们共享了数据,并没有独立创建。这个时候你要将物体变为profab才可以完全独立。   我在美科科技遇到的问题。

还是上一个问题

公共类的初始化,一定要用awake。  start有可能会太晚创建。

###鼠标拖拽事件

//需要在被拖拽的物体上添加的脚本
 using UnityEngine.EventSystems;
using UnityEngine;
public class ModuleDrag : MonoBehaviour, IDragHandler, IInitializePotentialDragHandler, IEndDragHandler, IDropHandler {
	void Start () {
	}
	void Update () {
	}
	public void OnInitializePotentialDrag(PointerEventData eventData)
    { 
    //当鼠标在A对象按下还没开始拖拽时 A对象响应此事件
        //注:此接口事件与IPointerDownHandler接口事件类似
        //    有兴趣的朋友可以测试下二者的执行顺序这里不再赘述
        Debug.Log("OnInitializePotentialDrag " + name);
    }
	public void OnDrag(PointerEventData eventData)
    {
        //当鼠标在A对象按下并拖拽时 A对象每帧响应一次此事件
        //注:如果不实现此接口,则后面的四个接口方法都不会触发
        Debug.Log("OnDrag " + name);
    }
public void OnEndDrag(PointerEventData eventData)
    {
        //当鼠标擡起时 A对象响应此事件
        Debug.Log("OnEndDrag " + name);
    }
	public void OnDrop(PointerEventData eventData)
    {
        //A、B对象必须均实现IDropHandler接口,且A至少实现IDragHandler接口
        //当鼠标从A对象上开始拖拽,在B对象上擡起时 B对象响应此事件
        //此时name获取到的是B对象的name属性
        //eventData.pointerDrag表示发起拖拽的对象(GameObject)
       Debug.Log(eventData.pointerDrag.name + " OnDrop to " + name);
    }
}
//需要在释放物体上放置的事件
public class ModuleDrop : MonoBehaviour, IDropHandler{
	// Use this for initialization
	void Start () {
	}// Update is called once per frame
	void Update () {
		
	}
	public void OnDrop(PointerEventData eventData)
    {
        //A、B对象必须均实现IDropHandler接口,且A至少实现IDragHandler接口
        //当鼠标从A对象上开始拖拽,在B对象上擡起时 B对象响应此事件
        //此时name获取到的是B对象的name属性
        //eventData.pointerDrag表示发起拖拽的对象(GameObject)
        Debug.Log(eventData.pointerDrag.name + " OnDrop to " + name);
    }
}

###ui
####如何让ui 跟随在相机中固定位置

设置rect transform 中的。anchor presets,按住alt即可选择预制位置,当然也可以通过脚本设置。

####如何让ui 不跟随相机,像普通2d物体一样固定在游戏世界

设置 Canvas 属性中的 Reader Modde 设置为World Space
此时 cavas只渲染镜头中出现的元素。也算是优化方法之一。

###关于旋转座标 rotation.
https://blog.csdn.net/ronintao/article/details/52236210

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章