VR在线班-Unity3D引擎基础【专治学不会】

唯一集苹果AATC和Unity两大官方授权的培训

VR/AR/游戏-Unity3D之Unity引擎基础
1213人加入学习
(0人评价)
价格 ¥299.00
教学计划

1  

public class Test7 : MonoBehaviour {
  在场景中鼠标点击地面后,角色可以移动到目标位置
  void Start () {
  
 }
 public float speed;   角色移动速度
 private Vector3 target;   目标位置
 private bool isOver = true; 移动是否结束
  1. 获取鼠标点击时的目标位置/目标点
  2.让角色移动到目标位置
  void Update () {
  
  1.获取鼠标点击时的目标位置/目标点使用射线实现1/ 
  1.创建射线
  从摄像机发射出条经过最标当前位置的射线
  Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition) ;   
   2.  发射射线
  RaycastHit hitInfo = new RaycastHit( );
  if (Physics.Raycast (ray,out hitInfo)) {
   获取碰撞点的位置
  if (hitInfo.collider.name = "Plane") {
  target = hitInfo.point;
  target.y = 0.5f;
  isOver =false ;} 
     2. 让角色移动到目标位置
    MoveTo (target);
 
     让角色移动到目标位置
            private void  MoveTo (Vector3 tar){
                if (!isOver ){
                    Vector3  v1 = tar- transform.position;
                    transform .position+=v1.Normalize()*speed*Time.deltaTime;
                    if (Vector3.Distance(tar.transform.position)<=0.1f){
                        isOver = true;
                        transform.position = tar; 
                    }
                }
                    
            } 
[展开全文]
penguin · 2018-09-04 · 射线 0

2 添加刚体,自由落体

3 Marerial  材质

4 动摩擦力

静摩擦力

弹力

摩擦力的结合性

弹力的结合性

 

[展开全文]
penguin · 2018-09-04 · 物理材质 0

碰撞相关的三个事件

        碰撞开始时会调用一次
        void OnCollisionEnter (Collision other) {
        
    }
    当碰撞持续发生的时候调用
    void OnCollisionStay(Collision other){
        检测和谁发生了碰撞
    if( string.Equals ("Cube1",other.gameObject.name)){
            print ("产生火花...");
        } //other.gameObject.name== Cube1  
    }
    碰撞结束时调用一次
       void OnCollisionExit(Collision other){
        
    }

 

 

2 发生触发的两个物体都必须有 Collider

至少有一个带有  Trigger

触发器相关的三个事件

    刚刚进入触发范围时调用一次
    void OnTriggerEnter (Collider other){
        print ("进入触发范围");
    }
    持续待在触发范围内会一直调用
    void OnTriggerStay (Collider other){
        print ("持续触发");
    }
    离开触发范围时会调用一次
    void OnTriggerExit (Collider other){
        print ("离开触发范围");
    }

[展开全文]

1刚体

2 collisder

发生碰撞的条件,两个游戏对象身上必须有collisder ,还有其中一个要有刚体组件

[展开全文]

2 使一些游戏对象有一些物理的现象,就添加 Rigidbody 组件

3 Mass 质量 相对的质量单位

Drag空气阻力 变大,下落速度减慢   Angular Drag  角阻力

Use Gravity 是否受到重力

Is Kinematic 是否使用运动学,一般不选择  Interpolate  差值 (分为 none  内差值 外差值

Collision Detection  碰撞检测 (离散碰撞检测  连续碰撞检测  连续动态碰撞检测)

Constraints  表示打枊钱游戏对象所会受到的约束 (位置和旋转)

3  以上可以在脚本中调用

 

 

[展开全文]
penguin · 2018-09-04 · 刚体 0

2  //  鼠标事件

// 1 当鼠标点击下去时调用(左键,必须点在游戏对象身上)

void OnMouseDown (){
        print ("Down");
    }

// 2 当鼠标取消点击时调用

void OnMouseUp (){
        print ("Up");
    }

// 3 当鼠标持续按下左键不放时调用

void OnMouseDrag (){
        print ("Drag");
    }

都必须在游戏对象内部点击才会调用,都是左键,在游戏对象外部松开鼠标也会打印up

// 4 当鼠标移动到内部时调用

void OnMouseEnter (){
        print ("Enter");
    }

//5 当鼠标离开内部时调用

void OnMouseExit (){
        print ("Exit");
    }

// 6 当鼠标持续停留在游戏对象身上时调用

void OnMouseOver (){
        print ("Over");
    }

// 7 当我们像点击按钮一样点击游戏对象

void OnMouseUpAsButton (){
        print ("UpAsButton");
    }

(在游戏对象内部点击,外部松开,不会打印)

[展开全文]
penguin · 2018-09-04 · 鼠标事件 0

1

2 将游戏对象点击拖拽到 Project 中,便可形成预设体,右下角有个滑竿,改变图标大小

3 先创建一个空对象   利用预设体来创建动态游戏对象

public GameObject playerPrefab;//定义完之后,需要到 unity 中,将cube 预设体拖拽到其中。
     void Update () {
        if (Input.GetKeyDown (KeyCode.P)) {
        //每当用户按下P键就会早场景中创建出一个 cube 的游戏对象

//用预设体动态创建游戏对象
            Instantiate (playerPrefab);
        
Vector3  pos = new Vector3 ();
            pos.y = 0.5f;

//使用Random.Range () 方法来产生随机数
            pos.x = Random.Range (-5f, 5f);
            pos.z = Random.Range (-5f, 5f);
            float angle = Random.Range (0f, 360f);
// 使用哪个预设体创建游戏对象

// 创建出的游戏对象初始位置

// 创建出的游戏对象初始旋转角度         Instantiate (playerPrefab, pos, Quaternion.AngleAxis (angle, Vector3.up));

//重新添加任何组件

GameObject p = Instantiate (playerPrefab, pos, Quaternion.AngleAxis (angle, Vector3.up))  as GameObject ;
            p.AddComponent <cubecontrollern > ();

}
    }

 

[展开全文]
penguin · 2018-09-04 · 预设体 0

1

2 Time 类 用来进行时间控制

void Update () {
        if (Input.GetKeyDown (KeyCode.P)) {

             // Time 类 用来进行时间控制
            float t = Time.time;
            print ("从当前游戏开始到当前帧,所消耗的总时长:" + t + "");

//从上一帧开始到当前帧结束,这两帧之间的时间间隔

float d = Time.deltaTime;
            print (d);

        }

//让当前游戏对象每秒钟准确的旋转30度

transform.Rotate(Vector3.up,Time.deltaTime * 30f);
    }

//表示时间流逝的快慢

// 1-- 表示正常时间流逝

// 2-- 表示时间流逝加快,是正常速度的两倍

// 0-- 表示时间停止,游戏暂停

float  ts = Time. timeScale;


}

public float angleSpeed;

void Update () {

transform.Rotate (Vector3.up, Time.deltaTime * angleSpeed);
    }

要进行精确地旋转或是位移,便要乘以   Time.deltaTime。

//求绝对值

int i =Mathf.Abs (-12) ;  // i=12

//求最大最小值

int m = Mathf.Max (12,16,44,3,5) ;

int ni = Mathf.Min (3,5) ;

//三角函数
Mathf.Sin () ;
Mathf.Cos () ;
Mathf,PI;
int s = Mathf.Sqrt (4); //求平方根,  s=2;
 
[展开全文]

1 Transform 组件

控制游戏对象的位置、旋转、缩放

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

2可用transform来获取当前脚本所挂载的游戏对象身上的  Transform 组件

  • 控制游戏对象的位置、旋转、缩放

position 属性---世界坐标系中的位置

  void Start () {
        Vector3 pos = transform.position;
        print (pos);
    }
    
     void Update () {
        if (Input.GetKeyDown (KeyCode.P))
            transform.position = Vector3.zero;或为,new Vector3(0,0,0); 
    }

  rotation (旋转,世界坐标系中的)localRotation (局部坐标系中的)为四元数,一般不直接修改

一般游戏对象有世界坐标和局部坐标,在cube 中再创建一个cube2 这个cube2就是cube的子对象,将cube的position rest,归零,其实是相对于子对象的原点,并不是世界坐标系中的原点。一个游戏对象有了副对象,坐标系便表示副对象的坐标。

获取局部坐标系中的位置

void Update () {
        if (Input.GetKeyDown (KeyCode.P))
            transform.localPosition = Vector3.zero;

scale(缩放)localcale 控制游戏对象的缩放,无scale这个属性。

void Start () {
 Vector3 sc = transform.localScale;
    }
     void Update () {
        if (Input.GetKeyDown (KeyCode.P))
 transform.localScale = new Vector3 (1f, 2f, 1f);
    }
}

  • 管理游戏对象间的父子关系      //获取,重新指定 当前游戏对象父对象的 transform组件​      transform.parent;​                    //获取当前游戏对象的根父对象   transform.root;             //获取当前游戏对象   叫做cube  的子对象                         transform.Find("cube");          transform.FindChild ("cube");​                                 若有多个重名的子对象,返回第一个。

还有一些属性,在Update中写

if (Input.GetKeyDown (KeyCode.P))

//产生移动的方法,变换当前游戏对象

transform.Translate(new Vector3(0,1,0)); (累加)

//产生旋转的方法,旋转当前游戏对象

transform.Rotate(Vector3.up,10f);

//欧拉角--属性,相当于定义了一种状态,执行一次,也是产生旋转。

transform.eulerAngles=new Vector3 (0f,45f,0f);

 

 

 

[展开全文]
penguin · 2018-09-04 · Transform 0

1 Vector3就是一个类,表示向量,向量既有大小又有方向的量。

2 在start 中写

 此为Vector3 的成员方法

 此为Vector3的类方法

  

 

[展开全文]
penguin · 2018-09-04 · Vector3 0

 1 Tag 标签 无具体作用,但对游戏对象添加标签,方便我们操作。Layer 层级,常用摄像机来使用,先有了这个标签,再添加到游戏对象身上。

2 游戏对象更像是一个容器,存放了很多组件。

3 GameObject  游戏对象类   脚本可以挂载到任何游戏对象身上。

4 gameObject   获取当前脚本所挂载的游戏对象,一般来说,在属性视图中能够看到或修改的属性,我们同样可以在脚本中获取并修改。在 Start 中编写。

  • 游戏对象的名字                print (gameObject.name); gameObject.name = "老王";
  • 获取游戏对象的   Tag              print   (gameObject.tag); gameObject.tag =" Player";
  • 获取当前游戏对象的激活状态  print (gameObject.activeSelf);       
  • 设置游戏对象的激活状态          gameObject.SetActive (false);    ( Start 开始时就把当前游戏对象设置为不激活,游戏对象也便看不到了。 )  
  • 获取游戏对象身上的组件           还可以手动添加脚本组件。controller 是控制器的意思。    ​                                                 
  • 给游戏对象添加指定类型的组件 (AddComponent 为添加组件的意思)                                 Light l = gameObject.AddComponent <Light> ();                                                以上方法都是一些实例方法,需要有一个 gameObject  这样的一个具体的对象才可以调用 。                                                                                      以下是 gameObject 本身的一些方法的调用。
  • 通过  Tag  值查找游戏对象      重新设置一个游戏对象,给与  Tag值                                    
  • 通过游戏对象的名字查找游戏对象                                       GameObject g = GameObject.Find ("Main Camera");
        g.name = "主摄像机";
     
  •  销毁游戏对象                             void Update () {
            if(Input.GetKeyDown(KeyCode.S) ){
                GameObject.Destroy (gameObject);
            }
        }
    ​                                           或为GameObject.Destroy (gameObject,2f);   意为按下S键后两秒钟之后销毁
  • 通过Tag值查找多个游戏对象   GameObject[] gg = GameObject.FindGameObjectsWithTag ("Player");
            print (gg);
                                                    
 
 
 

                                                               

[展开全文]
penguin · 2018-09-04 · GameObject 0

 

 

[展开全文]
Are. · 2018-04-19 · 刚体 0

1  获取按键   获取按键按下  获取按键弹起

2 获取用户事件需要使用 Input 类。使用Input 类时,都要写到 Update 中。

3   每帧都需要监听用户事件

在当前这一帧中,如果用户按下了 W 就会返回 true,否则返回 false。(对此代码的解释) bool b = Input.GetKeyDown (KeyCode.W);
        if (b) { 
            print ("往前走");
        }
   bool 布尔值

或者if(Input.GetKeyDown (KeyCode.W)){ print("往前走");

 or  Debug.Log("往前走");  }

4 Debug.Log  也可以用来输出。print  只能在 MonoBehaviour 的子类中使用,其他情况下只能使用 Debug.Log ()  来打印。

5 Input.GetKeyDown () 方法用来检测按键按下的事件。

Input.GetKeyUp () 方法用来检测按键弹起的事件。

 Input.GetKey () 方法用来检测持续按键的事件。

if (Input.GetKeyUp (KeyCode.Alpha1)){
            print ("弹起了1键");
    }

if (Input.GetKey (KeyCode.F)) {
            print ("按下了F键");
        }

7还可以用Input 来监听鼠标按键的监听。

参数0表示鼠标左键

参数1表示鼠标右键

参数2表示鼠标中键

Input.GetMouseButtonDown() 方法用来检测鼠标按键按下的事件。 if (Input.GetMouseButtonDown (0)) {
            print ("按下了鼠标左键");
        }

if (Input.GetMouseButtonDown (1)) {
            print ("按下了鼠标右键");
        }

if (Input.GetMouseButtonDown (2)) {
            print ("按下了鼠标中键");
        }

Input.GetMouseButtonUp() 方法用来检测鼠标按键弹起的事件。

if (Input.GetMouseButtonUp(0)) {
            print ("弹起了鼠标左键");
        }

同上;

Input.GetMouseButton() 方法用来检测鼠标按键持续按下的事件。if (Input.GetMouseButton(0)) {
            print ("持续按下鼠标左键");
        }

同上;

[展开全文]
penguin · 2018-09-04 · Input类 0

1 继承于 Monobehaviour  的类叫做运行时类

运行时类都不能手动实例化。一个脚本中可以存在在多个类。

2 方法有  Awake 唤醒  OnEnable Start 开始  Update 刷新,更新  LateUpdate OnDisable   OnDestroy  还有一些独立的方法 OnGUI  和  FixedUpdate, 这些方法定义了脚本的生命周期。 方法名不能写错。

3 a 每当脚本被加载时调用一次,在Awake 中做一些初始化操作,初始化   public  中的成员。 b  Awake 之后是 OnEable,在每次脚本激活时调用。c   在第一次调用 UpDate  之前调用一次 Start,也就是说,start在脚本生命周期内,只会被调用一次,也可以在  Start  中做一些初始化操作,不同于   Awake  中的初始化,Start  初始化一些私有的字段。d  每帧调用一次  UpDate  (每调用一次循环就是一帧,只有达到每秒六十帧,玩家才不会觉得画面卡)。 如果脚本一直处于激活状态,那么Update  和  LateUpdate  是一直被调用的,次数不断增加。 e  LateUpdate  在Update 方法调用完之后调用。f   取消激活脚本之后调用  OnDisable 。g  脚本在被销毁时调用  OnDestroy,只调用一次。 h   OnGUI  和  FixedUpdate  会被持续调用,但  OnGUI  会比  FixedUpdate  的频率更高。 OnGUI  是编写  UI 的。FixedUpdate  以固定的频率调用,不会受到图像刷新帧速率的影响,一般我们会把处理物理的代码放到这里。

[展开全文]

china.Unity3d.com

 

[展开全文]

1 Monobehaviour 脚本挂载到游戏对象身上,需要继承于Monobehaviour。 

2 再让其输出时,编写完语句记得保存。

3 名字可以随便改,且可以重复。

4 gameObject 表示当前脚本组件所挂载的游戏对象。

5 unity 中输出到控制台使用 print 或者 Debug.log 

6 transform 表示当前游戏对象身上的 Transform 组件。

7 要记得定义前用 pulic(公共的)。

8 component 组件 GetComponent 获取组件。

9 在 Test(游戏对象的脚本) 中定义了一些公共的方法,在其余的脚本中也都是可以使用的。假设在Test 中定义了 public int age;在另一脚本中若是要用到age ,便可以直接用  Test  t = GetComponent <Test>();(获取当前游戏对象身上的 Test 组件并且将其放到变量 t 中。)  便可直接用 t 来使用,例  t.age=24;

 

[展开全文]

射线

虚拟射线能过检测所能撞到的物体

使用Physics类的Raycast方法实现射线碰撞检

测功能

[展开全文]
菜瓜不菜 · 2018-04-03 · 射线 0

点击鼠标移动到指定位置
一、获取目标点
1、由摄像机到鼠标点创建一条射线
2、发射这条射线,并判定该射线是否与地面接触
3、如果与地面接触,得到该目标点
二、移动到目标点
1、求当前点距离目标点的向量
2、当前点向目标点每秒规律的移动
3、若当前点与目标点的向量距离小于0.1f,目标到达

[展开全文]
神梦一刀 · 2018-03-13 · 射线 0

课程特色

视频(18)
作业(2)
考试(1)

学员动态