开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

首页   >   博客   >   18803836360

基础

2017-5-18 18:22
标签:相机
FixUpdate——物理效果更新
lateUpdate——相机追踪
继承自MonoBehavior的所有类都可以当做组件
#################
Awake() 游戏对象一开始 在Start()方法之前会被调用
用来做初始化操作
比如在Start()方法中调用的一些方法需要的一些变量的初始化
FixedUpdate() 物理引擎 以相同的时间间隔调用
 
LateUpdate()
 
OnDisable()  对象停用时执行
Enbale() 对象勾选时执行
OnDestroy() 对象销毁时执行
 
 
##################
Input.GetKey(KeyCode.)    获取键值 返回Boolean
KeyCode  或 name:String
( 枚 举 )
 
Input.GetKeyDown()
Input.GetKeyUp()
按下时执行一次down() 若干次 getkey()
弹起时只执行一次up()
Awake :在start 之前调用  适合做一些初始化的操作 
start:
  //以上两个方法 在整个生命周期内只执行一次
Update:每帧都会被调用
LateUpdate:
 FixedUpdate:
 Reset:
 Ondisable:在对象停用而不是销毁的时候会调用
Enable:在勾选的时候 调用
OnDestroy:
if(Input.GetKey(KeyCode.X)  )  结果是一个布尔值
  Keycode本身是一个枚举
使用 GetKey(KyeDown) 时 同时执行了  GetKey(KeyCode)  Up时候只执行 Up。
Start和Awake在脚本的生命周期中只能运行一次,OnEnable和Ondisable会在脚本Hierarchy面板上激活和关闭时调用,一定要注意.
GetButton (string);参数为string类型的name,在Edit-ProjectSettings中的Input中查看.
注意OnMouse与OnMouseButton的区别,前者需要Collider.
射线只会被有Collider的物体阻挡.
改变物体的颜色:gameObject.renderer.material.color = Color.red;需要物体有Mesh Renderer组件. 
public属性不会暴露在Inspector面板中
Input.GetKey之类的只能使用官方指定按键
Inout.GetButton可以使用自制的按钮
监视面板里出现的是公有的字段
1.     Input.GetButton()和Input.GetKey()方法:
        Input.GetButton()方法调用Edit->ProjectSetting-> Input下定义好的按钮(用户可以自己定义按钮来  调用)推荐使用这种方式来定义游戏的按钮
        Input.GetKey()只能调用定义好的键盘的keyCode值,在使用非pc平台时不推荐使用
2.  在一次按下键盘下某个键的时候:
    Input.GetKey()方法会调用多次
    Input.GetKeyDown()方法只在键位按下时调用一次
    Input.GetKeyUp()方法只在键位弹起时调用一次
3.    MonoBehaviour类中:
     Awake()方法在Start()之前调用
    一般推荐使用Awake()方法来初始化数据
4.    OnMouseDown():
       当物体没有碰撞器(Collider)时,该方法无法作用
5.    当物体没有添加Rigidbody(刚体)组件时,无法对物体施加力
6.    rigidbody.AddForce():为物体添加力
        rigidbody.useGravity:设置物体的重力效果
7.    gameObject:附加当前脚本的物体
8.    gameObject.renderer:获取/设置当前物体的渲染器
9.     gameObject.renderer.material:获取/设置当前物体的渲染器中的材质球
        gameObject.renderer.material.color:获取/设置当前物体的渲染器中的材质球中的颜色
// 单例模式
using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {

private static GameManager _instance;

public static GameManager Instance
{
get 
{
if (null == _instance) {
_instance = new GameObject ("GameManager").AddComponent<GameManager> ();
return _instance;
}
}
}

void Awake(){
if (Instance) {
DontDestroyOnLoad (gameObject);
} else {
_instance = this;
DontDestroyOnLoad (gameObject);
}
}
}
.    单例设计模式在游戏中的使用方式:
        当物体在场景切换时不被销毁,且只存在一个时建议使用单例模式
        实现思路:
        1).定义一个私有的字段
        2).提供静态的属性来返回该字段,在该属性get方法中判断该字段是否为null,然后判断是否创建该字段对应的对象,并将该对象返回
        3).DontDestroyOnLoad(GameObject):在切换场景时不销毁该对象,可以在Awake方法中进行判断该GamObject对象是否存在,确保该对象只存在一个
Destroy():在场景消失
Disable():变为灰色的
2
activeSelf:自身
activeInheirt:父对象的激活状态
3
gameObject.transform=transform
//当前脚本所挂在的游戏对象
this.transfrom!=transform
//this代表脚本(组件)本身
activeself和activeinhe..
this.脚本本身,非游戏对象本身
transform.position=new Vector3(transform.position.x,Mathf.PingPong(Time.time,2),transform.position.z);
transform.Roatate(0,90*Time.deltaTime,0);
 
transfrom.localScale=new Vector3(Mathf.PingPong(Time.time,2),Mathf.PingPong(Time.time,2),Mathf.PingPong(Time.time,2));//本地缩放
//Mathf.PingPong往返
//Time.time
 
//
transform.Translate(Vector3.forward*speed*TIme.deltaTime
Mathf.PingPong(Time.time,length)
Translate
Rotate


Vector3.forward (0,0,1) 向前
对着y轴 顺时针为正
transform.Rotate():旋转
2.    Mathf.PingPong():反复循环
3.    transform.localScale:设置transform的大小
4.    transform.Translate():移动
5.    Input.GetAxis(""):根据坐标轴名称返回坐标轴的值
Mathf的三种用法:
Mathf(float,float,(Time.deltaTime));
Lerp是Mathf结构体里的方法。指逐渐变化。
Mathf.Lerp
Vector3.Lerp
Color.Lerp
lerp  就是一个 先快后慢的 平滑处理
 
颜色 大小 等等 都可以用
 
lerp是个Mathf的方法
 
三个参数  起始点数值  终点数值  时间间隔(即多少时间返回一次结果)
 
lerp 就是在不断的返回数值,需要用相应的对象去接受
延时
 
private float waitTime = 1.0f;
private float currentTime = 0.0f;
 
void Update()
{
    if(currentTime>waitTime)
    {
        //功能代码
        currentTime = 0;
    }
currentTime += Time.deltaTime;
}
 
方法:
InvokeRepeating("方法",开始时间,频率【几秒一次】)
唤醒或触发重复的操作
 
可以放在Start函数里
 
 
广播:
通知多个游戏对象执行某方法
BroadcastMessage("方法名",是否需要接受者)
BroadcastMessage("方法名",参数,选项)
一般不需要接受者 自己及子对象
InvokeRepeating重复调用方法
格式
InvokeRepeating(methodName:string,time:float,repeatRate:float)
在time秒调用methName方法;简单的说,根据时间调用制定方法名的方法
从第一次调用开始 每隔repeatRate时间调用一次
void Start(){
StartCoroutine("MoveBoxs");
}
IEnumeraor MoveBoxs(){
yield return new WaitForSeconds(1);
foreach(var box in Boxs){
while(box.tranform.position.y<MaxY){
box.tranform.transform.Translate(_speedVector3*Time.deltaTime);
}
yield return null;//
协同程序:相当于一个线程,可以俩个程序同时执行
StartCoroutine(MoveBoxs()):的协同函数不能被StopCoroutine()函数停止。
yield return null  等待下一帧
yield return 0 等待下一帧
yield return new waitforseconds(X)
等待X秒
先后顺序的操作:
协同函数:
Corouting


Vector3.one = (1,1,1)
返回值类型: IEnumerator

IEnumerator MoveBox()
{
yield return new WaitForSeconds(1);//
//yield return null;
等待一秒后再执行下面的语句
foreach(var variable in [])
{
while(box.transform.position.y<MaxY)
{
box.transform.Translate(_speedVector3.x * Time.deltaTime,_speedVector3.y*Time.deltaTime,_speedVector3.z*Time.deltaTime);
}
}


}

调用协同函数: StartCoroutine("方法名")或者方法
如:
StartCoroutine("MoveBox") 【建议】
StartCoroutine(MoveBox())

取消协同函数:StopCoroutine("MoveBoxes") 只有一个重载 且只有用StartCoroutine("MoveBoxes")启动的协同函数才能这样被取消。



using UnityEngine;
using System.Collections;

public class SimpleCoroutine : MonoBehaviour {
/// <summary>
/// Start, 协程的执行流程
/// Start函数运行,输出“1”,然后开始协程Do;
/// Do输出“2”,然后开始协程newDo;
/// newDo输出“3”,产生中断指令后暂停,立即返回Do;
/// Do产生中断指令后暂停,Do暂停并立即返回Start函数;
/// Start执行StartCoroutine的下一条语句:输出“4”;
/// 2秒后,newDo的中断指令完成并继续执行,输出“5”,协程newDo结束;
/// Do的中断指令因为协程newDo的结束而完成并继续执行,输出“6”,协程Do结束。
/// </summary>
void Start () {
Debug.Log("1");
StartCoroutine(Do());
Debug.Log("4");
}
IEnumerator Do() {
Debug.Log("2");
yield return StartCoroutine(newDo());//WaitForSeconds(5);
Debug.Log("6");
}
IEnumerator newDo() {
Debug.Log("3");
yield return new WaitForSeconds(2);
Debug.Log("5");
}
}
//输出结果顺序是,1,2,3,4,5,6
0 0

作者的其他最新博客

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册帐号
返回顶部