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;
}
}