IT小姿势游戏设计征服Unity3d

Unity刚体碰撞

2017-09-24  本文已影响140人  HaleyLiu

一.地板和墙体

1.关于地板和墙体,直接用create plane和cube即可


1.png

用plane绘制ground,用cube绘制墙体,然后在Asserts下创建材质,

2.png

其中材质的相关名词:

Albedo:反射率
Metallic:金属光泽
Occlusion:阻塞
detailmap mask:细节贴图蒙版
diffuse、fresnel mask:漫反射、菲涅尔贴图蒙版
metalness:金属
selh-illumination mask:自发光蒙版
sepcular intensity:高光强度
rimlight mask:边缘光蒙版
tint specular by base:基础高光颜色
specular exponent:高光级别

二.控制的角色,NPC和摄像机

这里Walls,Pick Ups是空的gameObject;子物体可以放入GameObject中
1.控制的角色(player)
需要添加刚体和脚本控制

using UnityEngine;

// Include the namespace required to use Unity UI
using UnityEngine.UI;

using System.Collections;

public class PlayerController : MonoBehaviour {
    public float speed; //速度
    public Text countText; //UI计数文本
    public Text winText; //UI胜利文本
    private Rigidbody rb; //刚体
    private int count; // 球体碰撞方块计数的结果

    // 游戏开始
    void Start (){
        // 获取刚体组件
        rb = GetComponent<Rigidbody>();

        //设置初始计数值为0
        count = 0;

        // 设置计数文本
        SetCountText ();

        // 胜利的文本
        winText.text = "";
    }

/*  
FixedUpdate是在固定的时间间隔执行,不受游戏帧率(fps)的影响,  
Update 是在每次渲染新的一帧的时候才会调用  
*/
    void FixedUpdate ()
    {
        // 水平轴向移动
        float moveHorizontal = Input.GetAxis ("Horizontal");
               //垂直轴向移动
        float moveVertical = Input.GetAxis ("Vertical");
               // 设定一个三维向量
        Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
               // 给刚体添加一个力,向量乘以速度
        rb.AddForce (movement * speed);
    }
/*
1)如果想实现两个刚体物理的实际碰撞效果时候用  
OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。  
OnCollisionEnter方法必须是在两个碰撞物体都不勾选isTrigger的前提下才能进入。
2)如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。只要  
勾选一个isTrigger那么就能进入OnTriggerEnter方法。
*/

/*
 添加一个触发器,如果碰撞到名为Pick Up的GameObject,那么这个物体  
消失,计数+1,执行SetCountText ();方法
*/
    void OnTriggerEnter(Collider other) {
        if (other.gameObject.CompareTag ("Pick Up")){
            other.gameObject.SetActive (false);
            count = count + 1;
            SetCountText ();
        }
    }

/*
 设置计数的文本,当count的值>=12时,显示"You Win!" 
*/
    void SetCountText()
    {
        countText.text = "Count: " + count.ToString ();
        if (count >= 12) 
        {
            winText.text = "You Win!";
        }
    }
}

2.NPC的脚本就比较简单了,就一个旋转。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotator : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    // Update is called once per frame
    void Update () {
/*  
以秒计算,完成最后一帧的时间(只读),旋转的值*增量时间,y轴方向上  
每秒40°旋转。 
        //transform.Rotate(Vector3.up *40* Time.deltaTime);
    transform.Rotate (new Vector3 (0, 40,0) * Time.deltaTime);
    }
}

3.设置相机跟随(原理就是让摄像机坐标位置和角色坐标位置保持一定的距离)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour {
    //申明一个游戏对象
    public GameObject player;
    //申明一个向量
    public Vector3 offset;
    // Use this for initialization
    void Start () {
        //用自身的坐标-游戏对象的坐标=距离差向量
        offset = this.transform.position - player.transform.position;
    }
    
    // 每次渲染新的一帧的时候才会调用
    void Update () {
        //让摄像机跟随游戏对象
        this.transform.position = player.transform.position + offset;   
    }
}

上一篇 下一篇

猜你喜欢

热点阅读