读一读

发生碰撞等,获取到碰撞的物体后

可以通过Transform和Collider组件等调用SendMessage("方法名")

来调用碰撞目标被碰撞后的回调函数。


RaycastHit2D hit = Physics2D.Linecast(Pos, targetPos);//Pos是主角的位置
Transform transform = hit.transform;//获取到碰撞到目标的Transform组件
Collider2D collider = hit.collider;//获取碰撞目标的2D碰撞体

Transform组件和Collider2D组件都可以访问tag属性,从而判断碰撞到的物体是什么


Rigidbody2D r = gameObject.GetComponent<Rigidbody2D>();
r.MovePosition(Vector2.Lerp(this.transform.position, Pos, speed * Time.deltaTime));

2D刚体的移动,一般刚体的运算都是放在FixedUpdate中的。


Has Exit Time 当前动画是否有退出时间

Exit Time 退出的时间点 0-1,1表示播放完

Transition Durations 两个动画的过度时间(协调用)

Conditions 使用到的变量用来控制过度是否触发


要使用Transform组件来设置父物体,子物体就会跑到父物体下

transform.SetParent(who.transform);
transform.SetParent(who.transform,false);

忽略第二个参数是,子物体会保持世界坐标的位置,自动计算本地坐标

指定第二个参数为false时,不会保持在原来世界坐标的位置。


首先选择连续的动画图片,直接拖拽到Scene或Hierarchy中,Unity会生成一个AnimatorController和一个Animation,形成的物体对象有一个组件Animator引用的就是这个生成的AnimatorController,这个AnimatorController里面包含默认动画为生成的Animation。如果该物体对象有多个动画的话,再选择多个这个动画的图片,拖拽到刚刚第一次拖拽的物体上,此时就只会生成一个Animation,直接显示在上次创建的AnimatorController中,使用同一个AnimatorController。


Mesh Filter组件存储一个Mesh,描述模型的网格(形状),拥有三角面的顶点信息。

Mesh Renderer组件通过Mesh获取信息,通过Material渲染模型的样子,并赋给颜色。


this.gameObject.GetComponent<MeshRenderer> ().material.color = Color.red;
  1. 先获取到Mesh Renderer组件

  2. 再获取到material材质

  3. 改变材质的属性color

  4. 其实是复制材质,改变材质,再赋值给renderer,抛弃原来的材质实例


一、对象池物体

using UnityEngine;
public class PooledObject:MonoBehaviour{
    pulbic ObjectPool Pool{get;set;}
    public void ReturnToPool(){
        if(Pool){
            Pool.AddObject(this);
        }else{
            Destory(gameObject);
        }
    }
}

如果不存在对象池,就销毁

要使用对象池管理时,就让物体继承PooledObject


二、对象池

public class ObjectPool:MonoBehaviour{
    PooledObject prefab;
    List<PooledObject> availableObjects = new List<PooledObject>();
    
    public PooledObject GetObject(){
        PooledObject obj;
        int lastAvailableIndex = availableObjects.Count-1;
        if(lastAvailableIndex >= 0){
            obj = availableObjects[lastAvailableIndex];
            availableObjects.RemoveAt(lastAvailableIndex);
            obj.gameObject.SetActive(true);
        }else{
            obj = Instantiate<PooledObject>(prefab);
            obj.transform.SetParent(transform,false);
            obj.Pool = this;
        }
        
        return obj;
    }
    
    public void AddObject(PooledObject obj){
        obj.gameObject.SetActive(false);
        availableObjects.Add(obj);
    }
}

transform.GetComponentsInChildren<type>();//获取自己和子物体所有type类型的组件