Unityunity修炼之路Unity基础入门分享

Unity基础

2016-06-21  本文已影响495人  akiunique

Unity基础开发--游戏蛮牛

1. 不认识的词

respawn [ˌriːˈspɔːn] vt. 复位vi. 重生
magnitude 英 ['mægnɪtjuːd] 美 ['mæɡnɪtud] n. 大小;量级;[地震] 震级;重要;光度
albedo 英 [æl'biːdəʊ] 美 [æl'bido]n. (行星等的)反射率;星体反照率
emission n. [环境] 排放;[环境] 排放物,辐射;发行
quaternion 英 [kwə'tɜːnɪən] 美 [kwə'tɝnɪən]n. 四元数;四个一组;四人一组
interpolate 英 [ɪn'tɜːpəleɪt] 美 [ɪn'tɝpəlet] vt. 篡改;插入新语句vi. 插入;篡改
torque 英 [tɔːk] 美 [tɔrk] n. 转矩,[力] 扭矩;项圈,金属领圈v. (向轴、螺栓、圆轮等)施以扭动力;(使)沿轴转动;使(绕轴等)扭转;施加转矩
polygon 英 ['pɒlɪg(ə)n] 美 ['pɑlɪɡɑn] n. 多边形;多角形物体

2. GameObject

gameObject.SetActive (false);   //设置为不激活,设置后不可见
CubeController c =  gameObject.GetComponent<CubeController>(); 
                                                //获取组件 泛型类型为组件名称类
if ( Input.GetKeyDown (KeyCode.S) ) {
     GameObject.Destroy (gameObject,2f);   }   } //两秒后销毁gameObject

3. Vector3

float l = v.magnitude;

· 方法一

 v.Normalize(); //将v的长度变为1 方向不变 无返回值

· 方法二

Vector3 vn = v.normalized(); //返回v方向上的单位向量,v本身不发现变化
Vector3 v1 = new Vector3(1.4f,6f,7.2f);
Vector3 v2 = new Vector3(2f,6.5f,12.3f);
float angle = Vector3.Angle(v1,v2); //返回一个角度 只有正数 不带方向
Vector3 pos1 = new Vector3(4f,2f,11f);
Vector3 pos2 = new Vector3(2f,13.6f,8f);
Vector3.Distance (pos1,pos2);
  1. 向量点乘
float dd = Vector3.Dot(v1,v2);
Vector3 vc = Vector3.Cross(v1,v2);

4. Transform

1 控制游戏对象的位置,旋转,缩放;

//位置
Vector3 pos1 = transform.position; //以世界坐标系来显示位置
Vector3 pos2 =transform.localPosition; //局部坐标系显示位置
transform.position = Vector3.zero'
//缩放
Vector3 sc = transform.localScale; 
transform.localScale = new Vector3(1f,2f,1f); //长宽高变为1 2 1

注意:当一个对象没有父对象时,transform中的坐标以世界坐标系来显示;当有父对象时,按局部坐标系显示。

void Update () {
    //变换当前游戏对象
    transform.Translate (new Vector3(0,1,0)); //新的位置 = 现在的位置 + 参数
    //旋转当前游戏对象
    transform.Rotate(Vector3.up , 10f); //以y轴正方向为轴旋转10度
    //属性 —— 欧拉角
    transform.eulerAngles = new Vector3(0f,45f,0f); //转到这个位置状态,执行一次
}

2 管理游戏对象父子之间的关系。

  transform.parent; //获取或重新指定当前游戏对象的父对象的transform组件,get + set
  transform.root; //获取当前游戏对象的根对象,只有get
  transform.Find("Cube"); //通过名字查找子对象的transform组件并返回
  transform.FindChild("Cube");//重名时默认返回第一个自对象

5. Time 和Mathf类

Time类:

float t =Time.time; // 游戏运行开始到当前帧运行的总时长,以秒记
float d =Time.deltaTime; //时间增量,从上一帧开始到当前帧结束之间的时间间隔
                         //FPS一般为60帧/s,即deltaTime为0.016秒左右,但不完全相同

//有些运动需按秒记时使用deltatime
transform.Rotate (Vector3.up,Time.deltaTime*30f); //让当前游戏对象每秒准确的旋转30度
transform.Translate(new Vector3(1,0,0)*Time.deltaTime); //每秒沿x轴方向移动1


//时间缩放的尺度,默认值为1,2表示2倍速,0表示时间停止游戏暂停
float ts = Time.timeScale; //物理与动画效果会同步计算

Mathf类:

int i = Mathf.Abs (-12); //int/float,求绝对值
int m = Mathf.Max(2,4,1,9,3); //求最大最小值
float s = Mathf.Sin(30f); //求三角函数
Mathf.PI; //π
int sq = Mathf.Sqrt (4); //求平方根

6. 预设体prefab

能够使对象和资源重复使用,相同的游戏对象可使用同一预设体来创建,对预设体进行修改后所有游戏对象都会相应改变。

public class Test : MonoBehaviour {
    //将预设体设为公共字段,并在unity中拖入预设体,作为GameObject的一个对象
    public GameObject playerPrefab;

    void Update () {
        //每当按下P键就会在场景中创建一个Player游戏对象
        if ( Input.GetKeyDown (KeyCode.P) ) {
                 //动态创建游戏对象,位置为预设体本身的位置
                  Vector3 position = new Vector3();

                 //使用random.range()方法产生随机数
                  position.y = 0.5f;
                  position.x = Random.Range (-5f,5f);
                  position.z = Random.Range (-5f,5f);
                  float angle = Random.Range (0f, 360f);

                 //Instantiate(playerPrefab);
                 //参数:预设体,游戏对象初始位置,游戏对象初始角度
                 Instantiate (playerPrefab,position, 
                                  Quaternion.AngleAxis(angle,Vector3.up) ); 
                 //Quaternion.identity表示旋转值为0

                 //Instantiate 返回Object类型 需使用as关键字将其转换为GameObject类型
                  GameObject P = Instantiate (playerPrefab, position,
                            Quaternion.AngleAxis(angle,Vector3.up) ) as GameObject;
                         }
           }
}

7. 鼠标事件

//鼠标点击
//1. 当鼠标点击时调用 点下必须在对象内部
void OnMouseDown() {
     print ("按下鼠标"); //只对按上该物体有用,每点击一次执行一次
    //与Input.GetMouseButtonDown()的区别为input点击画面各处都触发 }

//2 当鼠标取消点击时调用
void OnMouseUp(){
     print ("抬起鼠标");
}

//3 鼠标在对象内部按下不松
void OnMouseDrag(){
     print ("按住鼠标");
}

//鼠标滑动
//4 鼠标移动到对象内时调用
void OnMouseEnter(){
     print ("enter鼠标");
}

//5 鼠标离开对象内时调用
void OnMouseExit(){
     print ("exit鼠标");
}

//6 鼠标持续停留在游戏对象上时调用
void OnMouseOver(){
     print ("停留鼠标");
}

//7 只有在物体内弹起鼠标才触发,与OnMouseUp()的区别在于Up在外部弹起也会打印, 当然都需要在内部点下
void OnMouseUpAsButton(){
     print ("像按钮一样弹起鼠标");
}

8. 刚体 RigidBody

  1. 常用函数
    AddForce() 施加力
    AddExplosionForce() 施加爆炸力
    AddTorque() 施加力矩
    AddForceAtPosition() 在指定位置施加力
r = GetComponent<RigidBody>();
  if (Input.GetKey (KeyCode.Alpha1)) {

      r.AddForce(new Vector3(0f,10f,0f));  //给当前游戏对象添加一个力
      r.AddTorque(new Vector3(0f,10f,0f));  //添加扭矩/力矩

      //不在物体重心 而是在指定位置添加力。
      //第二个坐标为施加力的位置,为cube的本地坐标系,一个角
       r.AddForceAtPosition( new Vector3(0f,10f,0f), new Vector3(0.5f,0.5f,0.5f)); 
  }

      //在指定位置添加爆炸力参数为:力的大小,爆炸点,爆炸半径 
      //不能持续添加。即不能写在GetKey中而应该在GetKeyDown中
  if (Input.GetKeyDown (KeyCode.Alpha1)) {
       r.AddExplosionForce (2500f, Vector3.zero, 8);
  }

9. Collider

  1. 碰撞相关的三个事件
    //碰撞开始时调用一次
    void OnCollisionEnter(Collision other)
    {
        //刚开始与地面碰撞打印一次,之后每次碰撞打印一次
        print ("碰撞开始");
    }

    //碰撞结束时调用一次
    void OnCollisionExit(Collision other)
    {
        print("碰撞结束");
    }

    //当碰撞持续发生时调用
    void OnCollisionStay(Collision other)
    {
        //刚开始与地面碰撞打印了20次,是因为为Cube刚与地面接触还有轻微位移
        //完全静止后不再碰撞
        //只有在有相对位移时打印
        print("碰撞进行中");

        //检测与哪个物体发生了碰撞
        //other.gameObject.name;
        //other.gameObject.tag;
        if(string.Equals("Cube2", other.gameObject.name))
       {
            print ("产生火花");

        }
    }

2.触发器相关的三个事件
触发器可以被进入,表示要触发事件的一个范围。类似于地雷的范围。

    //刚进入触发范围时调用一次
    void OnTriggerEnter(Collider other)
    {
        print ("进入触发范围");
    }

    //持续停留在触发范围内会一直调用
    void OnTriggerStay(Collider other)
    {
        print ("持续触发");
    }

    //离开触发范围时调用一次
    void OnTriggerExit(Collider other)
    {
        print ("离开触发范围");
    }

10. 物理材质

11. 射线

public class PlayerController : MonoBehaviour {

    /*场景中鼠标点击地面后,角色移动到目标位置*/
    public float speed; //每秒移动多少个单位,数值可在脚本Component的面板中修改

    private Vector3 target;//目标位置
    private bool isOver = true; //移动是否结束

    void Update () {
        if (Input.GetMouseButtonDown (0)) {
            //1. 获取鼠标点击时的目标位置
            //使用射线实现,鼠标2D场景3D,点击时系统不知道到底点在高的哪个位置
            //从当前视角(当前摄像机作为起点)发出一条射线,穿过鼠标的位置与地面发生碰撞
                                                        //碰撞点为移动位置

            //a.创建射线
            //Ray ray = new Ray();
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
                                      //摄像机射出的射线经过某一点(鼠标位置点)

            //b.发射射线
            RaycastHit hitinfo = new RaycastHit();
            Physics.RaycastAll;//返回视线经过的所有物体的数组

            if(Physics.Raycast(ray,out hitinfo)) 
                        //Physics.Raycast返回bool,能否碰到游戏对象,返回首次碰到的物体
            {
                //获取碰撞点的位置
                //检测碰撞点是否为地面。hitinfo中
                if(hitinfo.collider.name == "Plane"){
                    target = hitinfo.point; //hitinfo.point为hitinfo保存的碰撞点的位置
                    target.y = 0.5f; //让cube保持在地面上
                    isOver = false;
                }
            }       
        }

        //2. 让角色移动到目标位置
        MoveTo (target);
    }

    //让角色移动到目标位置
    private void MoveTo(Vector3 tar){
        if (!isOver) {
            Vector3 vi =    tar - transform.position;
            transform.position += vi.normalized * speed * Time.deltaTime;  
                           //方向*大小*每秒规律执行,deltatime与帧无关,按秒计
            if(Vector3.Distance(tar, transform.position) <= 0.1f){ 
                              //目标位置与当前位置小于某个值,完全相等几率很低
                isOver = true;
                transform.position = tar;
            
          }
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读