Unity 镜头拉近效果(带缓冲)
var target : Transform;
var distance : float = 3.0;
var height : float = 1.0;
var damping : float = 5.0;
var smoothRotation : boolean = true;
var rotationDamping : float = 10.0;
var targetLookAtOffset : Vector3; // allows offsetting of camera lookAt, very useful for low bumper heights
var bumperDistanceCheck : float = 2.5; // length of bumper ray
var bumperCameraHeight : float = 1.0; // adjust camera height while bumping
var bumperRayOffset : Vector3; // allows offset of the bumper ray from target origin
function FixedUpdate() {
var wantedPosition = target.TransformPoint(0, height, -distance);
// check to see if there is anything behind the target
var hit : RaycastHit;
var back = target.transform.TransformDirection(-1 * Vector3.forward);
// cast the bumper ray out from rear and check to see if there is anything behind
if (Physics.Raycast(target.TransformPoint(bumperRayOffset), back, hit, bumperDistanceCheck)) {
// clamp wanted position to hit position
wantedPosition.x = hit.point.x;
wantedPosition.z = hit.point.z;
wantedPosition.y = Mathf.Lerp(hit.point.y + bumperCameraHeight, wantedPosition.y, Time.deltaTime * damping);
}
transform.position = Vector3.Lerp(transform.position, wantedPosition, Time.deltaTime * damping);
var lookPosition : Vector3 = target.TransformPoint(targetLookAtOffset);
if (smoothRotation) {
var wantedRotation : Quaternion = Quaternion.LookRotation(lookPosition - transform.position, target.up);
transform.rotation = Quaternion.Slerp(transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
} else {
transform.rotation = Quaternion.LookRotation(lookPosition - transform.position, target.up);
}
}
Untiy 动画加速
for (var state : AnimationState in animation)
{
state.speed = 0.5;
}
Unith3D判断物体是否在视角内
public var isRendering:boolean=false;
private var lastTime:float=0;
private var curtTime:float=0;
function Update()
{
isRendering=curtTime!=lastTime?true:false;
lastTime=curtTime;
}
function OnWillRenderObject()
{
curtTime=Time.time;
}
如何判断Unity3D角色动作播放结束
bool AnimationStillPlaying( string animationName )
{
return _animation.IsPlaying(animationName) && _animation[animationName].normalizedTime<1.0f;
}
normalizedTime: 范围0 -- 1, 0是动作开始,1是动作结束
利用Quaternion.LookRotation API 将旋转矩阵转换成四元数
Quaternion.LookRotation
private static Quaternion QuaternionLookRotation(Vector3 forward, Vector3 up)
{
forward.Normalize();
Vector3 vector = Vector3.Normalize(forward);
Vector3 vector2 = Vector3.Normalize(Vector3.Cross(up, vector));
Vector3 vector3 = Vector3.Cross(vector, vector2);
var m00 = vector2.x;
var m01 = vector2.y;
var m02 = vector2.z;
var m10 = vector3.x;
var m11 = vector3.y;
var m12 = vector3.z;
var m20 = vector.x;
var m21 = vector.y;
var m22 = vector.z;
float num8 = (m00 + m11) + m22;
var quaternion = new Quaternion();
if (num8 > 0f)
{
var num = (float)Math.Sqrt(num8 + 1f);
quaternion.w = num * 0.5f;
num = 0.5f / num;
quaternion.x = (m12 - m21) * num;
quaternion.y = (m20 - m02) * num;
quaternion.z = (m01 - m10) * num;
return quaternion;
}
if ((m00 >= m11) && (m00 >= m22))
{
var num7 = (float)Math.Sqrt(((1f + m00) - m11) - m22);
var num4 = 0.5f / num7;
quaternion.x = 0.5f * num7;
quaternion.y = (m01 + m10) * num4;
quaternion.z = (m02 + m20) * num4;
quaternion.w = (m12 - m21) * num4;
return quaternion;
}
if (m11 > m22)
{
var num6 = (float)Math.Sqrt(((1f + m11) - m00) - m22);
var num3 = 0.5f / num6;
quaternion.x = (m10+ m01) * num3;
quaternion.y = 0.5f * num6;
quaternion.z = (m21 + m12) * num3;
quaternion.w = (m20 - m02) * num3;
return quaternion;
}
var num5 = (float)Math.Sqrt(((1f + m22) - m00) - m11);
var num2 = 0.5f / num5;
quaternion.x = (m20 + m02) * num2;
quaternion.y = (m21 + m12) * num2;
quaternion.z = 0.5f * num5;
quaternion.w = (m01 - m10) * num2;
return quaternion;
}
Unity3D判断场景是否加载完成
加载场景时要用
public static AsyncOperation async;
async = Application.LoadLevelAsync(“SelectCarModelScreen”);
在加载场景里写
if (MainInterfaceGUIScript.async.isDone == false)
{
//________没 有加载完要做的事情如Logo__________________________
}
else
{
//全部加载完成后显示的东东。。
}
说明一点这种方法消耗性能哦
物体运动到指定位置
int smooth = 2;
Quaternion target = Quaternion.Euler(0, 0, 0);//目标
// Dampen towards the target rotation
transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
《《《《《《《《《《《《《《鼠标左键地形 物体移动至点击位置》》》》》》》》》》》》》
var moveSpeed:int=5;//player移动速度
var player:Transform;//定义一个人物的Transform
private var endposition : Vector3;
function Start()
{
endposition = player.transform.position;
}
function Update ()
{
if(Input.GetButtonUp("LeftMouse")){ //LeftMouse是在inputManager中设置的,左键值为mouse 0
PlayerMove();
}
var targetposition=player.TransformPoint(Vector3(0,48.8,-30));
transform.position=targetposition;//相机的目标位置,这两句代码的作用是让人物一直处于相机的视野下
if(endposition != player.transform.position){
player.position=Vector3.MoveTowards(player.position,endposition,Time.deltaTime*moveSpeed);
}
}
function PlayerMove()
{
var cursorScreenPosition:Vector3=Input.mousePosition;//鼠标在屏幕上的位置
var ray:Ray=Camera.main.ScreenPointToRay(cursorScreenPosition);//在鼠标所在的屏幕位置发出一条射线(暂名该射线为x射线)
var hit:RaycastHit;
if(Physics.Raycast(ray,hit)){
if(hit.collider.gameObject.tag=="Terrain"){//设置地形Tag为Terrain
endposition = hit.point;
}
}
}
射线测试+使用手势判断是否触碰了某物体
using unityEngine;
using System.Collections;
public class Lu : MonoBehaviour
{
public Camera cam;
// We need to actually hit an object
RaycastHit hitt = new RaycastHit();
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out hitt, 100);
// Debug.DrawLine(cam.transform.position, ray.direction,Color.red);
if (null != hitt.transform)
{
print(hitt.point);//鼠标点击的坐标
}
}
}
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
必须给物体添加碰撞器,比如Box Collider
然后在Update中检测手势,此处假设为手指在屏幕上移动
主相机的视角(Camera.main)从手指移动处(Input.GetTouch(0).position)发射射线,设置射线发射距离。
当射线碰撞到了带有碰撞器的物体,就会存储该物体的信息。
[csharp] view plaincopy
void Update(){
if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved){
Ray ray = Camera.main.ScreenPointToRay (Input.GetTouch(0).position);
//hit用来存储碰撞物体的信息
RaycastHit hit;
//ray表示射线,hit存储物体的信息,1000为设定射线发射的距离
if(Physics.Raycast (ray, out hit, 1000)){
print(hit.transform.name.ToString());
}
}
}
实例来创建对象
//Simple Instantiation of a Prefab at Start
var thePrefab : GameObject;
function Start () {
var instance : GameObject = Instantiate(thePrefab, transform.position, transform.rotation);
}
建立JAVA,把代码拖入到空GameJect上,然后把Prefab拖入到公共变量上,就可以了
声音播放 坐标转换
var cAudio:AudioClip;
function Update(){
}
function OnMouseDown () {
var screenSpace = Camera.main.WorldToScreenPoint(transform.position);
var offset = transform.position - Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x,transform.position.y, screenSpace.z));
while (Input.GetMouseButton(0)){
var curScreenSpace = Vector3(Input.mousePosition.x, transform.position.y, screenSpace.z);
var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
if(curPosition!=transform.position){
audio.Stop();
audio.clip = cAudio;
audio.Play();
}
transform.position = curPosition;
yield;
}
}
射线 (之鼠标点击的坐标)
using UnityEngine;
using System.Collections;
public class Lu : MonoBehaviour
{
public Camera cam;
// We need to actually hit an object
RaycastHit hitt = new RaycastHit();
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray, out hitt, 100);
// Debug.DrawLine(cam.transform.position, ray.direction,Color.red);
if (null != hitt.transform)
{
print(hitt.point);//鼠标点击的坐标
}
}
}
拖拽物体的脚本
function OnMouseDown () {
var screenSpace = Camera.main.WorldToScreenPoint(transform.position);
var offset = transform.position - Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
while (Input.GetMouseButton(0))
{
var curScreenSpace = Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
transform.position = curPosition;
yield;
}
}
用指定图片替换鼠标指针
//用指定图片替换鼠标指针
var mouse:Texture;
function Update(){
Screen.showCursor=false;//隐藏鼠标指针
}
function OnGUI{
var msPos=Input.mousePosition;//鼠标的位置
GUI.DrawTexture(Rect(msPos.x,Screen.height-msPos.y,20,20),mouse);
}
Unity 字体描边
private void MakeStroke(Rect position,string txtString,Color txtColor,Color outlineColor,int outlineWidth )
{
position.y-= outlineWidth;
GUI.color=outlineColor;
GUI.Label(position, txtString);
position.y+=outlineWidth*2;
GUI.Label(position, txtString);
position.y-=outlineWidth;
position.x-=outlineWidth;
GUI.Label(position, txtString);
position.x+=outlineWidth*2;
GUI.Label(position, txtString);
position.x-=outlineWidth;
GUI.color=txtColor;
GUI.Label(position, txtString);
}
调用外部的EXE和载入关卡
using unityEngine;
using System.Collections;
public class openexe: MonoBehaviour {
// Use this for initialization
void Start () {
System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();
Info.FileName = "C:\\Program Files\\Autodesk\\3dsMax8\\3dsmax.exe";
System.Diagnostics.Process.Start(Info);
}
// Update is called once per frame
void Update () {
}
}
-----------------载入关卡--------------
function OnGUI ()
{
if (GUI.Button(new Rect(400,400,100,20),"Start"))
{
Application.LoadLevel(1);
}
}
更多unity2018的功能介绍请到paws3d学习中心查找。链接https://www.paws3d.com/learn/,也可以加入unity学习讨论群935714213