这一部分内容比较基础,主要是给自己看的,各位高手手下留情,请自动忽略
刚体
1、刚体的常用方法:
Addforce
所有与物理相关的操作,需要放在FixedUpdate方法中
void FixedUpdate() {
///物理相关的操作,每帧时间固定
}
具体时间间隔在Edit->Project Setting->Time中的Fixed TimeStep下设置
可以用于实现子弹发射等效果
2、碰撞事件监测与处理:
//碰撞开始执行
void OnCollisionEnter(Collision coll)
{
Debug.Log("Hey ,you heart me");
Debug.Log(coll.gameObject.name); //获取得倒的物体名称
}
//碰撞结束执行
void OnCollisionExit(Collision coll)
{
Debug.Log("byebye");
Debug.Log(coll.gameObject.name);
}
//碰撞期间
void OnCollisionStay(Collision coll)
{
Debug.Log("Hey,there");
Debug.Log(coll.gameObject.name);
}
3、刚体的触发事件
碰撞体勾选IsTrigger则变成触发器,同样提供了几个监听方法
//触发开始执行
void OnTriggerEnter(Collider coll)
{
Debug.Log("Welcome");
Debug.Log(coll.gameObject.name); //获取得倒的物体名称
}
//触发结束执行
void OnTriggerExit(Collider coll)
{
Debug.Log("ByeBye");
Debug.Log(coll.gameObject.name);
}
//触发期间
void OnTriggerStay(Collider coll)
{
Debug.Log("Hey,there");
Debug.Log(coll.gameObject.name);
}
网格体:
1、网格过滤器 MeshFilter组件
用于设置网格体展示的模型
2、网格渲染器Mesh Render
CastShadows和ReceiveShadows 控制阴影的投射,Materials控制材质的显示
模型:
1、单个模型中心点的改变
UE4中提供了在编辑器中改变pivot的操作,u3d没有,但是可以通过添加一个空物体形成父子关系的方式来改变中心点。
配合中心点工具进行查看(Center为模型组的中心位置,Pivot为父物体的中心点位置)
2、旋转门
1、对父物体写脚本,控制父物体的旋转即可
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class Code_01: MonoBehaviour
{
private Transform m_Transfrom;
// Start is called before the first frame update
void Start()
{
Debug.Log("Hello");
m_Transfrom = gameObject.GetComponent<Transform>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Q))
{
Open();
}
if (Input.GetKeyUp(KeyCode.Q))
{
Close();
}
}
public void Open()
{
m_Transfrom.Rotate(Vector3.up,90);
}
public void Close()
{
m_Transfrom.Rotate(Vector3.up,-90);
}
}
2、利用触发器控制门的开关
可以使用空物体添加Collider来实现,Collider勾选IsTrigger来实现(比较符合实际的情况,有一个额外的传感器来获取是否有人进入)
查找游戏物体,包括使用游戏物体身上的脚本
通过场景中的物体名获取gameObject : GameObject.Find("DoorParent")
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Code_02 : MonoBehaviour
{
// Start is called before the first frame update
private Code_01 s_Code;
void Start()
{
s_Code = GameObject.Find("DoorParent").GetComponent<Code_01>();
}
// Update is called once per frame
void Update()
{
}
private void OnTriggerEnter(Collider other)
{
s_Code.Open();
}
private void OnTriggerExit(Collider other)
{
s_Code.Close();
}
}
思考一下这种模式,和UE4的区别,UE4是基于蓝图整合了一个物体Actor,其中的函数可以通过对该Actor的引用进行调用。而u3d是组件式的开发,脚本都相当于是一个单独的组件。
3、给模型添加Tag标签
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Code_03 : MonoBehaviour
{
private GameObject[] m_Object;
// Start is called before the first frame update
void Start()
{
m_Object = GameObject.FindGameObjectsWithTag("Interact");
foreach (var obj in m_Object)
{
Debug.Log(obj.name);
}
}
// Update is called once per frame
void Update()
{
}
}
关于碰撞的设置还有必要整理一下。
MeshRender对物理属性不产生影响,计算机计算的时候只会根据Rigidbody和collider来判断
1、小球(rigidbody+collider)) 触发器Trigger(带有一个boxcollider,不勾选ISTrigger)
此时小球无法穿过
2、小球的collider去掉或者勾选ISTrigger属性时,会由于rigid body模拟物理作用直接穿过地板下落
3、Trigger勾选IsTrigger属性时,小球才可以穿过
这里实现触发器中的Enter和Exit 方法用于简单的交互
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Code_02 : MonoBehaviour
{
// Start is called before the first frame update
private Code_01 s_Code;
void Start()
{
s_Code = GameObject.Find("DoorParent").GetComponent<Code_01>();
}
// Update is called once per frame
void Update()
{
}
private void OnTriggerEnter(Collider other)
{
s_Code.Open();
}
private void OnTriggerExit(Collider other)
{
s_Code.Close();
}
}
注意:只有带碰撞体的两个物体才可以做碰撞,
1、只有带rigidbody和碰撞体的物体进入Trigger 才会触发Trigger /Collision的方法
下面的就是去掉了小球的Rigidbody后的效果,boxcollider勾选IsTrigger属性
最后要说和UE4有什么区别的话那就是,选中父物体,直接拖到Asset 下后形成的这个预制体就有点类似与ue4中的actor蓝图了。