Unity2017官方案例Survival Shooter tutorial 浅析学习

来源:互联网 发布:文本相似度算法 评分 编辑:程序博客网 时间:2024/06/06 06:55

Unity2017官方案例Survival Shooter tutorial 浅析学习

  1. 案例里,预制体environment下地上有很多东西,然而我们不想担心后期的Ray发射到不同高度的物体上,为了使之更加简单,创建quad(设置Mask)调整位置覆盖游戏水平面,并且移除meshrender组件。meshfilter 决定模型网格;meshrenderer 渲染模型网格
  2. 因为我们不想Player随着时间推移越走越慢,所以将Drag and AngularDrag 设为Infinity(无穷大)。而后视实际情况限制position和rotation ,取消重力。
  3. AnimationController:
    这里写图片描述
  4. Input.GetAxisRaw 与Input.GetAxis的区别参考:http://blog.csdn.net/ye_xingren/article/details/9307553
    。大致是说,GetAxisRaw停即停,走立走,没有速度渐变现象。GetAxis有速度渐变现象。
  5. 归一化简单说就是将整个变化范围映射到0-1之间。
    Vector3.Set():设置现有的Vector3的x、y、z组件。
    Vector3.Normalize()和Vector3.Normalized:Vector3.Normalize()使向量的长度为1,当归一化的,一个向量保持相同的方向,但它的长度为1.0,注意,这个函数将改变当前向量,如果你想保持当前的向量不改变,使用normalized变量。如果这个向量太小而不能被归一化,将返回零向量。变量Vector3.Normalized,返回向量的长度为1(只读)。当归一化后,向量保持同样的方向,但是长度变为1.0。注意,当前向量不能改变,而是返回一个新的归一化的向量。如果你想归一化当前向量,使用Normalize函数。如果这个向量太小而不能被归一化,一个零向量将会被返回。我们在垂直和水平方向输入1,但vector是向量,结果大于1,故归一化。
  6. 实现游戏玩家Player随鼠标位置旋转,移动等等效果(划重点)

    public class PlayerMovement : MonoBehaviour{    public float speed = 6.0f;    Vector3 movement;//存储玩家移动方向的矢量    Animator anim;//animator组件的引用    Rigidbody playerRigidbody;    int floorMask;//一个层蒙版,以便射线能仅仅投射到Floor层的游戏物体.之所以说int类型,因为层是由1~32表示,且下方代码的GetMask是返回值是int类型的函数    float camRayLength = 100f;//从相机进入场景的射线长度    void Awake()    {        floorMask = LayerMask.GetMask ("Floor");        anim = GetComponent<Animator> ();        playerRigidbody = GetComponent<Rigidbody> ();    }    void FixedUpdate()    {        float h = Input.GetAxisRaw ("Horizontal");        float v = Input.GetAxisRaw ("Vertical");        Move(h, v);        Turning();        Animating(h, v);    }    void Move(float h,float v)    {        movement.Set (h, 0f, v);        movement = movement.normalized * speed * Time.deltaTime;        playerRigidbody.MovePosition (transform.position + movement);    }    void Turning()    {        Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);//从相机到屏幕上的鼠标光标创建射线        RaycastHit floorHit;//创建射线投射碰撞变量来存储射线碰撞信息,RaycastHit 一个结构体。        if(Physics.Raycast(camRay/*射线的起点和方向*/,out floorHit/*包含碰到器碰撞的更多信息*/,camRayLength/*射线的长度。*/,floorMask/*投射射线,选择投射的层蒙版。*/))            {                Vector3 playerToMouse =floorHit.point - transform.position;                playerToMouse.y=0f;                Quaternion newRotation =Quaternion.LookRotation(playerToMouse);                playerRigidbody.MoveRotation(newRotation);            }    }    void Animating(float h,float v)//动画状态切换。    {        bool walking = h != 0f || v != 0f;//角色要在动        anim.SetBool ("IsWalking",walking);    }}
  7. 相机跟随Player移动:

    public class CameraFollow : MonoBehaviour {public Transform target;//相机跟随位置public float smoothing=5f;//相机移动速度Vector3 offset;void Start () {    offset = transform.position - target.position;//相机到玩家的向量}void FixedUpdate () {    Vector3 targetCamPos = target.position + offset;//玩家移动的新位置加上之前的向量差    //transform.position =target.position + offset;    transform .position =Vector3.Lerp(transform.position ,targetCamPos,smoothing*Time.deltaTime);//相机平滑移动到新位置。Vector3.Lerp(从a到b,t)线性差值  }/*void LateUpdate(){    transform.position =target.position + offset;}*/}

    参照RollBall案例的方法也可以达到类似效果,不过该案例通过改smothing值产生跟随效果。

  8. 为Zoombunny再添加sphereCollider是为了探测是否进入能伤害player的范围。

  9. 打开window下的navigation窗口后,添加 NavMeshAgent 导航网格代理组件。该组件附加于游戏中移动角色上,允许使用导航网格在场景中进行导航,实现自动寻路。(environment的static勾选,这就意味着当我们创建导航区域,烘焙导航网格,我们所指定的东西都将包含在内成为导航空间) 。烘焙的蓝色区域是可行走区域
    public class EnemyMovement : MonoBehaviour
    {
    Transform player;
    UnityEngine.AI.NavMeshAgent nav;
    void Awake ()
    {
    player = GameObject.FindGameObjectWithTag ("Player").transform;
    nav = GetComponent <UnityEngine.AI.NavMeshAgent> ();
    }
    void Update ()//nav不是物理性质的
    {
    nav.SetDestination (player.position);//自动寻路
    }

  10. canvas的三种render mode:
    1:Screen Space-Overlay:填充整个屏幕,尽管屏幕窗口变化,不需要任何的摄像机,且UI出现在所有摄像机的最前面
    2:Screen Space-Camera:这种模式需要绑定一个UICamrea,可透视
    3:World Space:这种模式,UI和3d对象完全一样。比如有个对话泡沫从角色嘴边冒出。

  11. RectTransform详解:http://www.jianshu.com/p/dbefa746e50d
    。。。

·如果做的项目不是很大或者画面不需要太精细,建议使用quad,反之用plane。