id="cproIframe_u1121907_1" width="300" height="250" src="http://pos.baidu.com/acom?adn=4&at=134&aurl=&cad=1&ccd=24&cec=UTF-8&cfv=18&ch=0&col=zh-CN&conOP=0&cpa=1&dai=1&dis=0&layout_filter=rank%2Ctabcloud<r=http%3A%2F%2Fwww.xuanyusong.com%2Farchives%2Fcategory%2Funity%2Funity%25E6%259D%2582%25E6%2596%2587<u=http%3A%2F%2Fwww.xuanyusong.com%2Farchives%2F3535&lunum=6&n=92004029_cpr&pcs=1920x946&pis=10000x10000&ps=369x1329&psr=1920x1080&pss=1920x409&qn=18654b05cfe79f33&rad=&rsi0=300&rsi1=250&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000FF&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=&td_id=1121907&tn=text_default_300_250&tpr=1447382786461&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1121907&ti=Unity3D%E7%A0%94%E7%A9%B6%E9%99%A2%E4%B9%8B%E7%9B%91%E5%90%ACProject%E8%A7%86%E5%9B%BE%E7%BB%93%E6%9E%84%E5%8F%98%E5%8C%96%E7%9A%84%E4%BA%8B%E4%BB%B6%20%7C%20%E9%9B%A8%E6%9D%BEMOMO%E7%A8%8B%E5%BA%8F%E7%A0%94%E7%A9%B6%E9%99%A2&tt=1447382786449.13.31.35" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="margin: 0px; padding: 0px; font-family: inherit;">
今天雨松MOMO无意间发现了一个更好的方法来监听Project视图中资源的 创建 删除 移动 保存。把如下脚本放在unity工程中即可,推荐放在Editor目录下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
// Originally written by Lasse Makholm, I believe.
// Changed a bit for non-Team-license systems by Jamie Fristrom ( happionlabs.com / @happionlabs ) - without Team license, it'll post an error message
// if you try to save to a readonly file. With Team license, it will prevent you from editing a readonly file.
// I'm pretty sure Unity intended to release this into the wild but not positive.
/*
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
using
UnityEngine
;
using
UnityEditor
;
using
System
.
Collections
;
using
System
.
IO
;
using
System
.
Linq
;
using
System
.
Collections
.
Generic
;
using
System
;
public
class
RespectReadOnly
:
UnityEditor
.
AssetModificationProcessor
{
// Known issues:
// You can still apply changes to prefabs of locked files (but the prefabs wont be saved)
// You can add add components to prefabs (but the prefabs wont be saved)
// IsOpenForEdit might get called a few too many times per object selection, so try and cache the result for performance (i.e called in same frame)
public
static
void
OnWillCreateAsset
(
string
path
)
{
Debug
.
Log
(
"OnWillCreateAsset "
+
path
)
;
}
public
static
string
[
]
OnWillSaveAssets
(
string
[
]
paths
)
{
List
<
string
>
result
=
new
List
<
string
>
(
)
;
foreach
(
var
path
in
paths
)
{
if
(
IsUnlocked
(
path
)
)
result
.
Add
(
path
)
;
else
Debug
.
LogError
(
path
+
" is read-only."
)
;
}
Debug
.
Log
(
"OnWillSaveAssets"
)
;
return
result
.
ToArray
(
)
;
}
public
static
AssetMoveResult
OnWillMoveAsset
(
string
oldPath
,
string
newPath
)
{
AssetMoveResult
result
=
AssetMoveResult
.
DidNotMove
;
if
(
IsLocked
(
oldPath
)
)
{
Debug
.
LogError
(
string
.
Format
(
"Could not move {0} to {1} because {0} is locked!"
,
oldPath
,
newPath
)
)
;
result
=
AssetMoveResult
.
FailedMove
;
}
else
if
(
IsLocked
(
newPath
)
)
{
Debug
.
LogError
(
string
.
Format
(
"Could not move {0} to {1} because {1} is locked!"
,
oldPath
,
newPath
)
)
;
result
=
AssetMoveResult
.
FailedMove
;
}
Debug
.
Log
(
"OnWillMoveAsset from"
+
oldPath
+
" to "
+
newPath
)
;
return
result
;
}
public
static
AssetDeleteResult
OnWillDeleteAsset
(
string
assetPath
,
RemoveAssetOptions
option
)
{
if
(
IsLocked
(
assetPath
)
)
{
Debug
.
LogError
(
string
.
Format
(
"Could not delete {0} because it is locked!"
,
assetPath
)
)
;
return
AssetDeleteResult
.
FailedDelete
;
}
Debug
.
Log
(
"OnWillDeleteAsset"
+
assetPath
)
;
return
AssetDeleteResult
.
DidNotDelete
;
}
public
static
bool
IsOpenForEdit
(
string
assetPath
,
out
string
message
)
{
if
(
IsLocked
(
assetPath
)
)
{
message
=
"File is locked for editing!"
;
return
false
;
}
else
{
message
=
null
;
return
true
;
}
}
static
bool
IsUnlocked
(
string
path
)
{
return
!
IsLocked
(
path
)
;
}
static
bool
IsLocked
(
string
path
)
{
if
(
!
File
.
Exists
(
path
)
)
return
false
;
FileInfo
fi
=
new
FileInfo
(
path
)
;
return
fi
.
IsReadOnly
;
}
}
|
另外注意一下, 此方法是监听将要进行 创建 删除 移动 保存 的操作, 也就是程序到下一帧才会真正执行 创建 删除 移动 保存。
原文在这里 也可以直接下载。http://gamedevblog.typepad.com/RespectReadOnly.cs
- 本文固定链接: http://www.xuanyusong.com/archives/3535
- 转载请注明: 雨松MOMO 2015年06月15日 于 雨松MOMO程序研究院 发表