Unity中3D场景中一些使用方法(为自己)
2015-12-07 12:16
543 查看
Unity 3D场景中的模型 和 角色名字保持相对位置
给摄像机添加一个Look At Target脚本,并将其Target设为人物。
接着自己写一个脚本Camera Round,拖给摄像机,让摄像机绕着人物旋转。
using UnityEngine;
using System.Collections;
public class cameraRound : MonoBehaviour {
public GameObject hero;
void Update () {
gameObject.transform.RotateAround(hero.transform.position,Vector3.up,0.1f);
}
}
using UnityEngine;
using System.Collections;
public class blood_bar : MonoBehaviour {
public GameObject _bloodBar;//获取血条信息。
public GameObject MainCamera;//获取主摄像机
void Update () {
_bloodBar.transform.position=new Vector3(transform.position.x,transform.position.y+2.0f,transform.position.z);//让血条信息一直处于人物的头顶某处
Vector3 v=transform.position-MainCamera.transform.position;
Quaternion rotation;
rotation = Quaternion.LookRotation(v);
_bloodBar.transform.rotation = rotation;//让血条一直面向摄像机。由于摄像机是以人物为目标的,所以v应该为人物的位置到摄像机位置的向量,否则信息栏会出现偏差。
}
}
//################## 简单的AI处理 #############
Enemy_AI.js
private var Regression : Vector3;
public var Player_Prefab : Transform;
public var Enemy_State : String;
public var Doing : boolean = true;
public var Range : float = 4.0;
public var Bullet : Transform;
public var Bullet_Prefab : Transform;
//初始化敌人方向和位置
function Start()
{
transform.localEulerAngles.y = Random.value * 360;
Regression = transform.position;
}
//敌人行动模式
public var Thinking : boolean = true;
public var Thinking_Time : float = 1.0;
private var relativePos : Vector3;
private var rotation : Quaternion;
public var Facing : boolean = false;
public var Facing_Time : float = 2.0;
public var Facing_Speed : float = 2.0;
public var Moving : boolean = false;
public var Moving_Speed : float = 0.5;
public var Moving_Time : float = 4.0;
public var Moving_Back : boolean = false;
public var Attacking : boolean = false;
private var Bullet_DO : boolean = true;
public var Bullet_CD : float = 0.2;
//随机移动方位
private var R_Position : Vector3;
function Update ()
{
if(Attacking)
{
Enemy_State = "Attacking";
Facing = true;
Moving = true;
//Doing = true;
Thinking = false;
var dist2 = Vector3.Distance(Regression, transform.position);
if(dist2 > 20)
{
relativePos = Regression - transform.position;
rotation = Quaternion.LookRotation(relativePos);
Attacking = false;
Moving_Back = true;
}
}
if(!Moving_Back)
{
var dist = Vector3.Distance(Player_Prefab.position, transform.position);
if(dist > 100)
{
Attacking = false;
return;
}
else if(dist < 5)
{
Attacking = true;
}
RayJudge();
}
transform.localEulerAngles.x = 0;
transform.localEulerAngles.z = 0;
if(Thinking && !Attacking && !Moving_Back)
{
Enemy_State = "Thinking";
if(Doing)
{
StartCoroutine(Think(Thinking_Time));
Doing = false;
}
}
if(Facing)
{
Enemy_State = "Facing";
if(Attacking)
{
relativePos = Player_Prefab.position - transform.position;
rotation = Quaternion.LookRotation(relativePos);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);
}
else if(Moving_Back)
{
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);
}
else
{
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed);
if(Doing)
{
StartCoroutine(Face(Facing_Time));
Doing = false;
}
}
}
if(Moving)
{
Enemy_State = "Moving";
if(Moving_Back)
{
transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 6);
}
else if(dist > 2)
{
if(Attacking)
{
transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 4);
}
else
{
transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed);
}
}
if(Doing && !Attacking)
{
StartCoroutine(Move(Moving_Time));
Doing = false;
}
}
}
//前方锁敌
function RayJudge()
{
var layerMask = 1 << 2;
layerMask = ~layerMask;
var hit : RaycastHit;
if(Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit, 20,layerMask))
{
var distanceToForward = hit.distance;
if(hit.transform.tag == "Player")
{
Attacking = true;
if(Bullet_DO)
{
var Create = Instantiate (Bullet_Prefab, Bullet.position, Quaternion.identity);
Create.rigidbody.AddForce (Bullet.forward * 1000);
StartCoroutine(Wait(Bullet_CD));
Bullet_DO = false;
}
}
}
}
function Wait(waitTime : float)
{
yield WaitForSeconds (waitTime);
Bullet_DO = true;
}
function Move(waitTime : float)
{
print("Move");
if(Moving_Back)
{
yield WaitForSeconds (waitTime * 0.4);
}
else
{
yield WaitForSeconds (waitTime + Random.value * 2);
}
Thinking = true;
Moving_Back = false;
Moving = false;
Facing = false;
Doing = true;
}
function Face(waitTime : float)
{
print("Face");
yield WaitForSeconds (waitTime + Random.value);
Facing = false;
Thinking = false;
Moving = true;
Doing = true;
}
function Think(waitTime : float)
{
print("Thinking");
yield WaitForSeconds (waitTime + Random.value);
R_Position = Regression + Random.insideUnitSphere * Range;
R_Position.y = Regression.y;
relativePos = R_Position - transform.position;
rotation = Quaternion.LookRotation(relativePos);
Thinking = false;
Moving = false;
Facing = true;
Doing = true;
}
//#############################
//#################### 射线点击 实现鼠标控制 旋转和移动 #######################
private bool flagMove;
private RaycastHit hit;
private Vector3 mousePos;
private Vector3 targetDir;
// Use this for initialization
void Start()
{ flagMove = false; }
void Update()
{
if (Input.GetMouseButtonDown(0))
{ RayControl(); }
if (flagMove)
{
if (Vector3.Distance(transform.position, mousePos) > 0.1)
{ transform.Translate(transform.worldToLocalMatrix * transform.right * Time.deltaTime * 0.5f); }
else
{
flagMove = false;
}
}
}
void RayControl()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从Camera发射射线到屏幕
if (Physics.Raycast(ray, out hit))//射线碰撞检测
{
mousePos = hit.point;
mousePos.z = transform.position.z;
targetDir = mousePos - transform.position;//计算到目标点的方向
Vector3 tempDir = Vector3.Cross(transform.right, targetDir.normalized);
float dotValue = Vector3.Dot(transform.right, targetDir.normalized);
float angle = Mathf.Acos(dotValue) * Mathf.Rad2Deg;//计算夹角
if (tempDir.z < 0)//根据叉乘判断夹角的正负
{ angle = angle * (-1); }
if (!float.IsNaN(angle))
{
transform.RotateAround(transform.position, Vector3.forward, angle);//转向目标点
}
flagMove = true;
}
}
//##################################################################################
//##############################
//################################################################
#
using UnityEngine; using System.Collections; public class NamePanel : MonoBehaviour { [SerializeField] UILabel lblName; [SerializeField] GameObject obj; [SerializeField] Camera mainCamera; [SerializeField] Camera uiCamera; void Update() { UpdateNamePosition(); } Vector3 m_position; /// <summary> /// 更新名字位置 /// </summary> void UpdateNamePosition() { //取模型在主摄像机中的世界坐标 m_position = obj.transform.position; //转换为主摄像机的屏幕坐标 m_position = mainCamera.WorldToScreenPoint(m_position); //用得到的屏幕坐标,在UI摄像机中转换为世界坐标 m_position = uiCamera.ScreenToWorldPoint(m_position); m_position.z = 0f; m_position.y += 0.1f; lblName.transform.position = m_position; } }
给摄像机添加一个Look At Target脚本,并将其Target设为人物。
接着自己写一个脚本Camera Round,拖给摄像机,让摄像机绕着人物旋转。
using UnityEngine;
using System.Collections;
public class cameraRound : MonoBehaviour {
public GameObject hero;
void Update () {
gameObject.transform.RotateAround(hero.transform.position,Vector3.up,0.1f);
}
}
using UnityEngine;
using System.Collections;
public class blood_bar : MonoBehaviour {
public GameObject _bloodBar;//获取血条信息。
public GameObject MainCamera;//获取主摄像机
void Update () {
_bloodBar.transform.position=new Vector3(transform.position.x,transform.position.y+2.0f,transform.position.z);//让血条信息一直处于人物的头顶某处
Vector3 v=transform.position-MainCamera.transform.position;
Quaternion rotation;
rotation = Quaternion.LookRotation(v);
_bloodBar.transform.rotation = rotation;//让血条一直面向摄像机。由于摄像机是以人物为目标的,所以v应该为人物的位置到摄像机位置的向量,否则信息栏会出现偏差。
}
}
//################## 简单的AI处理 #############
Enemy_AI.js
private var Regression : Vector3;
public var Player_Prefab : Transform;
public var Enemy_State : String;
public var Doing : boolean = true;
public var Range : float = 4.0;
public var Bullet : Transform;
public var Bullet_Prefab : Transform;
//初始化敌人方向和位置
function Start()
{
transform.localEulerAngles.y = Random.value * 360;
Regression = transform.position;
}
//敌人行动模式
public var Thinking : boolean = true;
public var Thinking_Time : float = 1.0;
private var relativePos : Vector3;
private var rotation : Quaternion;
public var Facing : boolean = false;
public var Facing_Time : float = 2.0;
public var Facing_Speed : float = 2.0;
public var Moving : boolean = false;
public var Moving_Speed : float = 0.5;
public var Moving_Time : float = 4.0;
public var Moving_Back : boolean = false;
public var Attacking : boolean = false;
private var Bullet_DO : boolean = true;
public var Bullet_CD : float = 0.2;
//随机移动方位
private var R_Position : Vector3;
function Update ()
{
if(Attacking)
{
Enemy_State = "Attacking";
Facing = true;
Moving = true;
//Doing = true;
Thinking = false;
var dist2 = Vector3.Distance(Regression, transform.position);
if(dist2 > 20)
{
relativePos = Regression - transform.position;
rotation = Quaternion.LookRotation(relativePos);
Attacking = false;
Moving_Back = true;
}
}
if(!Moving_Back)
{
var dist = Vector3.Distance(Player_Prefab.position, transform.position);
if(dist > 100)
{
Attacking = false;
return;
}
else if(dist < 5)
{
Attacking = true;
}
RayJudge();
}
transform.localEulerAngles.x = 0;
transform.localEulerAngles.z = 0;
if(Thinking && !Attacking && !Moving_Back)
{
Enemy_State = "Thinking";
if(Doing)
{
StartCoroutine(Think(Thinking_Time));
Doing = false;
}
}
if(Facing)
{
Enemy_State = "Facing";
if(Attacking)
{
relativePos = Player_Prefab.position - transform.position;
rotation = Quaternion.LookRotation(relativePos);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);
}
else if(Moving_Back)
{
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);
}
else
{
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed);
if(Doing)
{
StartCoroutine(Face(Facing_Time));
Doing = false;
}
}
}
if(Moving)
{
Enemy_State = "Moving";
if(Moving_Back)
{
transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 6);
}
else if(dist > 2)
{
if(Attacking)
{
transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 4);
}
else
{
transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed);
}
}
if(Doing && !Attacking)
{
StartCoroutine(Move(Moving_Time));
Doing = false;
}
}
}
//前方锁敌
function RayJudge()
{
var layerMask = 1 << 2;
layerMask = ~layerMask;
var hit : RaycastHit;
if(Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit, 20,layerMask))
{
var distanceToForward = hit.distance;
if(hit.transform.tag == "Player")
{
Attacking = true;
if(Bullet_DO)
{
var Create = Instantiate (Bullet_Prefab, Bullet.position, Quaternion.identity);
Create.rigidbody.AddForce (Bullet.forward * 1000);
StartCoroutine(Wait(Bullet_CD));
Bullet_DO = false;
}
}
}
}
function Wait(waitTime : float)
{
yield WaitForSeconds (waitTime);
Bullet_DO = true;
}
function Move(waitTime : float)
{
print("Move");
if(Moving_Back)
{
yield WaitForSeconds (waitTime * 0.4);
}
else
{
yield WaitForSeconds (waitTime + Random.value * 2);
}
Thinking = true;
Moving_Back = false;
Moving = false;
Facing = false;
Doing = true;
}
function Face(waitTime : float)
{
print("Face");
yield WaitForSeconds (waitTime + Random.value);
Facing = false;
Thinking = false;
Moving = true;
Doing = true;
}
function Think(waitTime : float)
{
print("Thinking");
yield WaitForSeconds (waitTime + Random.value);
R_Position = Regression + Random.insideUnitSphere * Range;
R_Position.y = Regression.y;
relativePos = R_Position - transform.position;
rotation = Quaternion.LookRotation(relativePos);
Thinking = false;
Moving = false;
Facing = true;
Doing = true;
}
//#############################
//#################### 射线点击 实现鼠标控制 旋转和移动 #######################
private bool flagMove;
private RaycastHit hit;
private Vector3 mousePos;
private Vector3 targetDir;
// Use this for initialization
void Start()
{ flagMove = false; }
void Update()
{
if (Input.GetMouseButtonDown(0))
{ RayControl(); }
if (flagMove)
{
if (Vector3.Distance(transform.position, mousePos) > 0.1)
{ transform.Translate(transform.worldToLocalMatrix * transform.right * Time.deltaTime * 0.5f); }
else
{
flagMove = false;
}
}
}
void RayControl()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从Camera发射射线到屏幕
if (Physics.Raycast(ray, out hit))//射线碰撞检测
{
mousePos = hit.point;
mousePos.z = transform.position.z;
targetDir = mousePos - transform.position;//计算到目标点的方向
Vector3 tempDir = Vector3.Cross(transform.right, targetDir.normalized);
float dotValue = Vector3.Dot(transform.right, targetDir.normalized);
float angle = Mathf.Acos(dotValue) * Mathf.Rad2Deg;//计算夹角
if (tempDir.z < 0)//根据叉乘判断夹角的正负
{ angle = angle * (-1); }
if (!float.IsNaN(angle))
{
transform.RotateAround(transform.position, Vector3.forward, angle);//转向目标点
}
flagMove = true;
}
}
//##################################################################################
//##############################
//################################################################
#
相关文章推荐
- unity tweak tool安装失败的解决方法
- unity3d 之本地推送
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(52)-美化EasyUI皮肤和图标
- unity与ios交替
- Unity 8 和 Windows Continuum,两大跨平台系统到底有何不同
- unity--ugui中文教程翻译2
- Unity3D打包APK,无法打进Jar的解决办法
- 项目记录07--客unity,服erlang--AStarPathing 寻路
- Unity Sprite转Prefab
- Unity 使用 Application.LoadLevelAsync() 方法切换场景后场景变黑问题解决方法
- unity3d添加子弹爆炸预制体动画
- unity3d添加武器功能
- Unity3D与MySQL
- UNITY贝塞尔曲线Bezier的一个细节
- 【转】unity跨平台文件操作详解
- unity--ugui中文教程翻译1
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(51)-系统升级
- iGraph库中Community Detection方法比较
- 使用Unity制作简单时钟动画
- 【Unity】改变向量的方向而不改变其大小